Compare commits

..

29 Commits
master ... mini

Author SHA1 Message Date
kailong321200875 9caa008551 feat: 同步代码 2024-02-22 17:35:05 +08:00
kailong321200875 7c18060e18 feat: 同步代码 2024-02-07 11:07:41 +08:00
kailong321200875 4891f49b7d feat: 同步代码 2024-01-31 14:23:10 +08:00
kailong321200875 07ca222ee0 mod: 解决冲突 2024-01-29 08:52:17 +08:00
kailong321200875 bfda9f6485 feat: 同步代码 2024-01-29 08:50:16 +08:00
kailong321200875 67a202fef3 feat: 同步代码 2024-01-21 15:09:34 +08:00
kailong321200875 48c5c9af8a feat: 同步代码 2024-01-18 16:13:14 +08:00
kailong321200875 1af33d8a7e feat: 同步master 2024-01-16 11:20:49 +08:00
kailong321200875 9eb1356c4e feat: 同步master 2024-01-09 14:25:23 +08:00
kailong321200875 6a83d08309 feat: 同步master代码 2024-01-03 10:39:42 +08:00
kailong321200875 607b73a7b3 feat: 更新mini分支 2023-12-19 09:46:22 +08:00
kailong321200875 a1e89b7c8a chore: node最低要求18 2023-11-22 14:47:35 +08:00
kailong321200875 d93d1ee6a0 chore: 更新依赖 2023-11-22 14:44:18 +08:00
kailong321200875 96c5a968ef chore: 更新依赖 2023-11-22 14:43:31 +08:00
kailong321200875 c954f2b7e0 fix: 修复BUG 2023-10-14 11:29:40 +08:00
Archer 1df9644a11
Merge pull request #353 from wen-shiqiang/mini
fix: 修复BUG
2023-10-11 09:32:59 +08:00
文士强 47f4b5a8ae fix: 修复BUG 2023-10-10 19:39:00 +08:00
kailong321200875 fbe68ba683 fix: 修复BUG 2023-10-07 15:07:37 +08:00
kailong321200875 9652712677 fix: 修复Table组件插槽传参错误 2023-08-12 07:57:08 +08:00
Archer 7959b6c62a
Merge pull request #312 from maoxuner/mini
fix: #311 移除stylelint-config-prettier依赖
2023-08-10 08:50:28 +08:00
陆伯言 25e416e3bb
fix: #311 移除stylelint-config-prettier依赖 2023-08-09 20:59:12 +08:00
kailong321200875 5d1356c4a9 fix: 修复Collapse点击区域问题 2023-08-09 17:23:57 +08:00
kailong321200875 b0daac8471 mod: 删除无用文件 2023-08-09 17:17:45 +08:00
Archer d46119e174
Merge pull request #310 from maoxuner/mini
fix: 404页面缺失
2023-08-09 17:07:19 +08:00
陆伯言 7efed9ed12
fix: 404页面缺失 2023-08-09 16:56:08 +08:00
kailong321200875 5f2048d52d fix: 修复Form组件BUG 2023-08-05 20:38:07 +08:00
kailong321200875 97c293bc6e Merge branch 'v2' into mini 2023-08-05 17:50:04 +08:00
kailong321200875 c3a2cc0a5f Merge branch 'v2' into mini 2023-08-05 14:15:55 +08:00
kailong321200875 255843d4c0 feat: 简易版本 2023-08-05 11:09:40 +08:00
260 changed files with 561 additions and 32201 deletions

View File

@ -1,5 +0,0 @@
Android 4.1
IOS 7.1
Chrome > 31
ff > 31
ie >= 11

View File

@ -17,7 +17,4 @@ VITE_USE_ALL_ELEMENT_PLUS_STYLE=true
VITE_USE_MOCK=true
# 是否使用在线图标
VITE_USE_ONLINE_ICON=true
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=false
VITE_USE_ONLINE_ICON=true

View File

@ -35,7 +35,4 @@ VITE_USE_MOCK=true
VITE_USE_CSS_SPLIT=true
# 是否使用在线图标
VITE_USE_ONLINE_ICON=true
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=false
VITE_USE_ONLINE_ICON=true

View File

@ -35,7 +35,4 @@ VITE_USE_MOCK=true
VITE_USE_CSS_SPLIT=true
# 是否使用在线图标
VITE_USE_ONLINE_ICON=true
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=false
VITE_USE_ONLINE_ICON=true

View File

@ -35,7 +35,4 @@ VITE_USE_MOCK=true
VITE_USE_CSS_SPLIT=true
# 是否使用在线图标
VITE_USE_ONLINE_ICON=false
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=false
VITE_USE_ONLINE_ICON=true

View File

@ -35,7 +35,4 @@ VITE_USE_MOCK=true
VITE_USE_CSS_SPLIT=false
# 是否使用在线图标
VITE_USE_ONLINE_ICON=true
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=false
VITE_USE_ONLINE_ICON=true

8
.eslintignore Normal file
View File

@ -0,0 +1,8 @@
/build/
/config/
/dist/
/*.js
/test/unit/coverage/
/node_modules/*
/dist*
/src/main.ts

70
.eslintrc.js Normal file
View File

@ -0,0 +1,70 @@
// @ts-check
const { defineConfig } = require('eslint-define-config')
module.exports = defineConfig({
root: true,
env: {
browser: true,
node: true,
es6: true
},
parser: 'vue-eslint-parser',
parserOptions: {
parser: '@typescript-eslint/parser',
ecmaVersion: 2020,
sourceType: 'module',
jsxPragma: 'React',
ecmaFeatures: {
jsx: true
}
},
extends: [
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
'plugin:prettier/recommended'
],
rules: {
'vue/no-setup-props-destructure': 'off',
'vue/script-setup-uses-vars': 'error',
'vue/no-reserved-component-names': 'off',
'@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/no-empty-function': 'off',
'vue/custom-event-name-casing': 'off',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'no-unused-vars': 'off',
'space-before-function-paren': 'off',
'vue/attributes-order': 'off',
'vue/one-component-per-file': 'off',
'vue/html-closing-bracket-newline': 'off',
'vue/max-attributes-per-line': 'off',
'vue/multiline-html-element-content-newline': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/attribute-hyphenation': 'off',
'vue/require-default-prop': 'off',
'vue/require-explicit-emits': 'off',
'vue/html-self-closing': [
'error',
{
html: {
void: 'always',
normal: 'never',
component: 'always'
},
svg: 'always',
math: 'always'
}
],
'vue/multi-word-component-names': 'off',
'vue/no-v-html': 'off'
}
})

View File

@ -1,131 +0,0 @@
name: Automerge
on:
pull_request:
types:
- labeled
- unlabeled
- synchronize
- opened
- edited
- ready_for_review
- reopened
- unlocked
pull_request_review:
types:
- submitted
status: {}
jobs:
# 合并发布版本的 pr 到 master
auto-merge:
runs-on: ubuntu-latest
steps:
- name: Automerge
uses: 'pascalgn/automerge-action@v0.14.3'
env:
BASE_BRANCHES: 'release'
GITHUB_TOKEN: '${{ secrets.TOKEN }}'
MERGE_LABELS: ''
MERGE_FILTER_AUTHOR: 'kailong321200875'
push-to-gh-pages:
needs: [auto-merge]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Pnpm
uses: pnpm/action-setup@v2
with:
version: latest
- name: use Node.js 18
uses: actions/setup-node@v2.1.2
with:
node-version: '18.x'
- name: Set SSH Environment
env:
DOCS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$ACTIONS_DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com > ~/.ssh/known_hosts
chmod 700 ~/.ssh && chmod 600 ~/.ssh/*
git config --local user.email "321200875@qq.com"
git config --local user.name "kailong321200875"
# 发布到 github
- name: Build Github
run: |
pnpm install --no-frozen-lockfile
pnpm run build:pro
- name: Deploy Github
uses: peaceiris/actions-gh-pages@v3
with:
deploy_key: ${{secrets.ACTIONS_DEPLOY_KEY}}
publish_branch: gh-pages
publish_dir: ./dist-pro
force_orphan: true
cname: element-plus-admin.cn
push-to-gh-pages-gitee:
needs: [auto-merge]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Pnpm
uses: pnpm/action-setup@v2
with:
version: latest
- name: use Node.js 18
uses: actions/setup-node@v2.1.2
with:
node-version: '18.x'
- name: Set SSH Environment
env:
DOCS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$ACTIONS_DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com > ~/.ssh/known_hosts
chmod 700 ~/.ssh && chmod 600 ~/.ssh/*
git config --local user.email "321200875@qq.com"
git config --local user.name "kailong321200875"
- name: Build Gitee
run: |
pnpm install --no-frozen-lockfile
pnpm run build:gitee
# 发布到 gitee
- name: Deploy Gitee
uses: peaceiris/actions-gh-pages@v3
with:
deploy_key: ${{secrets.ACTIONS_DEPLOY_KEY}}
publish_branch: gh-pages-gitee
publish_dir: ./dist-pro
force_orphan: true
- name: Sync Github Repos To Gitee # 名字随便起
uses: Yikun/hub-mirror-action@v1.1 # 使用Yikun/hub-mirror-action
with:
src: github/kailong321200875 # 源端账户名(github)
dst: gitee/kailong110120130 # 目的端账户名(gitee)
dst_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} # SSH密钥对中的私钥
dst_token: ${{ secrets.GITEE_TOKEN }} # Gitee账户的私人令牌
account_type: user # 账户类型
clone_style: 'https' # 使用https方式进行clone也可以使用ssh
debug: true # 启用后会显示所有执行命令
force_update: true # 启用后,强制同步,即强制覆盖目的端仓库
static_list: 'vue-element-plus-admin' # 静态同步列表,在此填写需要同步的仓库名称,可填写多个
timeout: '600s' # git超时设置超时后会自动重试git操作

View File

@ -1,19 +0,0 @@
on:
push:
branches:
- release
name: Release
jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: GoogleCloudPlatform/release-please-action@v3
id: release
with:
token: ${{ secrets.TOKEN }}
default-branch: release
release-type: node
package-name: standard-version
changelog-types: '[{"type": "types", "section":"Types", "hidden": false},{"type": "revert", "section":"Reverts", "hidden": false},{"type": "feat", "section": "Features", "hidden": false},{"type": "fix", "section": "Bug Fixes", "hidden": false},{"type": "improvement", "section": "Feature Improvements", "hidden": false},{"type": "docs", "section":"Docs", "hidden": false},{"type": "style", "section":"Styling", "hidden": false},{"type": "refactor", "section":"Code Refactoring", "hidden": false},{"type": "perf", "section":"Performance Improvements", "hidden": false},{"type": "test", "section":"Tests", "hidden": false},{"type": "build", "section":"Build System", "hidden": false},{"type": "ci", "section":"CI", "hidden":false}]'

2
.gitignore vendored
View File

@ -4,6 +4,6 @@ dist
dist-ssr
*.local
/dist*
*-lock.*
pnpm-debug
stats.html
.idea

View File

@ -1 +1,4 @@
npx --no -- commitlint --edit $1
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
pnpm commitlint --edit "$1"

View File

@ -1,6 +1,6 @@
module.exports = {
'*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
'{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --parser json --write'],
'{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --write--parser json'],
'package.json': ['prettier --write'],
'*.vue': ['prettier --write', 'stylelint --fix'],
'*.{scss,less,styl,css,html}': ['stylelint --fix', 'prettier --write'],

View File

@ -1,2 +1,8 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
[ -n "$CI" ] && exit 0
# Format and submit code according to lintstagedrc.js configuration
npm run ts:check
npm run lint:lint-staged
npm run lint:lint-staged

View File

@ -3,6 +3,7 @@
/dist*
/public/*
/docs/*
/vite.config.ts
/src/types/env.d.ts
/docs/**/*
/plop/**/*

View File

@ -1,11 +1,11 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"prettier.enable": true,
"prettier.enable": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
},
"i18n-ally.localesPaths": ["src/locales"],
"i18n-ally.keystyle": "nested",

View File

@ -2,560 +2,6 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [2.8.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.8.0...v2.8.1) (2024-06-20)
### Bug Fixes
* [#458](https://github.com/kailong321200875/vue-element-plus-admin/issues/458) ([49451ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/49451ae606009d1f5ab0b98f84535892d3fd7646))
* [#481](https://github.com/kailong321200875/vue-element-plus-admin/issues/481) ([c77586c](https://github.com/kailong321200875/vue-element-plus-admin/commit/c77586c5670cdc63978b032bbda694a14e875838))
* 修复 search组件的收起展开 和重置 Bug ([9a5c7bc](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a5c7bcb5b51e76eac6bc1d3aebc287593b13ca1))
* 修复css前缀无法应用问题([#482](https://github.com/kailong321200875/vue-element-plus-admin/issues/482)) ([4b43c87](https://github.com/kailong321200875/vue-element-plus-admin/commit/4b43c87949fe4a68b4be004a06dfff4c7f87fbd4))
* 修复表格default-expand-all属性无效BUG ([6657bbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/6657bbc9f11f22cbfb04a57f5629bc810575496e))
* 修复表格合计报错问题 ([9c44006](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c44006ec26bee446dc5c90b6a4546cdd84ba4dc))
### Styling
* 修改登录页样式 ([9f98b7b](https://github.com/kailong321200875/vue-element-plus-admin/commit/9f98b7be266825612f93135c460d7db2d6a8beb0))
### Performance Improvements
* 优化使用离线图标后运行慢问题 ([7e9c4a6](https://github.com/kailong321200875/vue-element-plus-admin/commit/7e9c4a6109b417a577d9ac9ecf02db52eb1964af))
## [2.8.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.7.0...v2.8.0) (2024-06-01)
### Types
* 修复Table类型错误 ([79b917a](https://github.com/kailong321200875/vue-element-plus-admin/commit/79b917af4957aa4b47db46e034385477828f5fca))
### Features
* Add a new component CodeEditor ([#466](https://github.com/kailong321200875/vue-element-plus-admin/issues/466)) ([00989b7](https://github.com/kailong321200875/vue-element-plus-admin/commit/00989b7ac9b92685be495c15c1f11dd2546eb6be))
### Bug Fixes
* [#427](https://github.com/kailong321200875/vue-element-plus-admin/issues/427) ([a00d76e](https://github.com/kailong321200875/vue-element-plus-admin/commit/a00d76e4149b430e19c985a78b9d89ce992dba3f))
* [#428](https://github.com/kailong321200875/vue-element-plus-admin/issues/428) ([97a1cd4](https://github.com/kailong321200875/vue-element-plus-admin/commit/97a1cd41de82dad8855c95cec6bb106541fd53a7))
* [#432](https://github.com/kailong321200875/vue-element-plus-admin/issues/432) ([df5b716](https://github.com/kailong321200875/vue-element-plus-admin/commit/df5b7166b48b7e0e77a1fb10ab6dd353d186547e))
* [#438](https://github.com/kailong321200875/vue-element-plus-admin/issues/438) ([f977fdb](https://github.com/kailong321200875/vue-element-plus-admin/commit/f977fdb05d018ee07baeb6db454b9a77acb89f07))
* [#451](https://github.com/kailong321200875/vue-element-plus-admin/issues/451) ([08665a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/08665a35ac606549322039d073daf8072053eef4))
* [#465](https://github.com/kailong321200875/vue-element-plus-admin/issues/465) ([8996e01](https://github.com/kailong321200875/vue-element-plus-admin/commit/8996e01ca35bfad8c13bef321f86bdd711202e12))
* less 变量命名与 css 关键字冲突 [#475](https://github.com/kailong321200875/vue-element-plus-admin/issues/475) ([1c56e13](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c56e13c5523a86d77464eccee26b5408db028c7))
* 修复 lint-staged 中 prettier 以 json 格式美化代码的无效命令问题 ([7b2eae1](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b2eae1d6aa813e162c3ad4a0553d2df480c765f))
* 修复 Transfer 组件 optionApi 不生效 ([198718b](https://github.com/kailong321200875/vue-element-plus-admin/commit/198718b8749a036263d756f928b5dd38cfb47701))
* 修复富文本编辑器初始化时, 报错 Error: Cannot find a descendant at path [0,1] in node ([a65d5fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/a65d5fd20334307a56cb469361e8f9bd838510c9))
* 修复组件-查询界面收起和展开功能bug [#473](https://github.com/kailong321200875/vue-element-plus-admin/issues/473) ([8e58eae](https://github.com/kailong321200875/vue-element-plus-admin/commit/8e58eaeed6ea9beb749afaed75edc5a4f6d9867a))
### Docs
* 更新群二维码 ([2c89dbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c89dbc884c38511d40c92480f65aef46511cefb))
### Performance Improvements
* 已经是 FormData 对象的不用再次转换 ([d582ad4](https://github.com/kailong321200875/vue-element-plus-admin/commit/d582ad428f4b378014d063635c4afbbad944a71a))
## [2.7.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.6.0...v2.7.0) (2024-02-29)
### Features
* IAgree ([abb6906](https://github.com/kailong321200875/vue-element-plus-admin/commit/abb69064dfdb979e2843e3a1b62a2510f6ed3637))
* 头像列表 ([3bf28a5](https://github.com/kailong321200875/vue-element-plus-admin/commit/3bf28a5d4555bf2a10754474db81d70b04ee432a))
* 新增个人中心页 ([4146716](https://github.com/kailong321200875/vue-element-plus-admin/commit/4146716655bfbe4ae5b780e5b52a6377efd914ec))
### Bug Fixes
* 修复启动慢问题 ([61d7ef6](https://github.com/kailong321200875/vue-element-plus-admin/commit/61d7ef642a027e9e1f942bc84322233be3ca9a82))
* 修复第四种布局样式层级问题([#424](https://github.com/kailong321200875/vue-element-plus-admin/issues/424)) ([78aeb89](https://github.com/kailong321200875/vue-element-plus-admin/commit/78aeb897fc93cfb998f94578d1fbe4480426843f))
### Docs
* 更新群二维码 ([c8c1a1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8c1a1b6357105da73e23adff968c3f2fad7d837))
## [2.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.6...v2.6.0) (2024-02-07)
### Features
* add vite-plugin-url-copy ([f5ab977](https://github.com/kailong321200875/vue-element-plus-admin/commit/f5ab9776a90e0136b243601571f4619c20da3ccd))
### Bug Fixes
* Table组件中size属性的validator设置错误 ([f30e37e](https://github.com/kailong321200875/vue-element-plus-admin/commit/f30e37ee777d4f30d4ae58c4a016a1392d41c25f))
* Table组件注册为全局组件报错问题存在对pinia的提前引用 ([1e209a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/1e209a702a5114943a615063eefd0c00f1a6a003))
* Table组件设置 align="center" 导致横向滚动条位置错误问题 ([22f071d](https://github.com/kailong321200875/vue-element-plus-admin/commit/22f071d9268806f7abd23ab2d08e9392e377a426))
* 修复 element-plus 2.5版本以上el-form-item inline模式下select宽度问题 ([f44e48d](https://github.com/kailong321200875/vue-element-plus-admin/commit/f44e48d08d3f8dd347b829166107dd62e5e18c72))
* 修复 prettier 报错 ([f5f08f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/f5f08f8f87b063d489f55ea8f19c7c802acf15f7))
* 修复 useCrudSchemas 详情组件数据结构文案不匹配问题 ([d94fc0a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d94fc0a701bcbc9343ab3e7b630e3db8f6d61623))
* 修复cutMenu布局刷新样式问题 ([03580b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/03580b0ca0c8d088589ae1d8426b1535f654361b))
* 修复Menu组件缩略菜单弹窗内样式不统一问题 ([d5dc4e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d5dc4e32d5978fcd271e841832c9cbf1e0c87db7))
* 修复TagsView右键菜单逻辑错误 ([901c891](https://github.com/kailong321200875/vue-element-plus-admin/commit/901c891872ef6164e3517eb8e798d6039b7b7f4e))
* 修复test打包VITE_USE_ONLINE_ICON无效问题 ([a3436a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/a3436a32c6fd746e9e2af67c3cc5a8872aabf919))
* 修复本地化图标空白问题 ([14ff83a](https://github.com/kailong321200875/vue-element-plus-admin/commit/14ff83affcd267fbdb405d2f46e9f929a1fbfaeb))
* 修复请求示例中mock开启时无法取消单个请求的问题 ([d6d70a4](https://github.com/kailong321200875/vue-element-plus-admin/commit/d6d70a443cccb2fe12161b57a1f227d1ed63384a))
* 修改兼容方式兼容Form 组件中contentMap中类输入框或下拉选择的所有组件特殊兼容 InputNumber 组件 ([ab98ceb](https://github.com/kailong321200875/vue-element-plus-admin/commit/ab98ceb85f52c5f7b87c2114997c63f1b80f216f))
* 更换判断条件 ([b5cb626](https://github.com/kailong321200875/vue-element-plus-admin/commit/b5cb626bfac4df8b1a0741b5000d5b22f6cd4555))
### Docs
* 修改群二维码 ([395ff68](https://github.com/kailong321200875/vue-element-plus-admin/commit/395ff68412ff71a9b8ce670c2399da285cfed67d))
* 更新群二维码 ([c8ccaa8](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8ccaa8d49b5bf7a2784a29af6e126657ce54cda))
### Styling
* 添加TabMenu边框 ([feb3d9a](https://github.com/kailong321200875/vue-element-plus-admin/commit/feb3d9a8d07f6444c39ca89f6eb63245c06783a0))
## [2.5.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.5...v2.5.6) (2024-01-18)
### Bug Fixes
* [#396](https://github.com/kailong321200875/vue-element-plus-admin/issues/396) ([9b2b4d4](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b2b4d42a6d5fffd5012506b7cac3892774c8595))
* [#399](https://github.com/kailong321200875/vue-element-plus-admin/issues/399) ([59d4ed4](https://github.com/kailong321200875/vue-element-plus-admin/commit/59d4ed4dd9d6b6f0d5881b4d466e7a621770ad75))
* 修复Form组件设置了hidden还是会出现占位空白 ([0f531fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/0f531fd1d0469ddd56327b0a9a7956a0d6076c91))
* 修复无法登录问题 ([8ce00ab](https://github.com/kailong321200875/vue-element-plus-admin/commit/8ce00ab247de4061cb56f9c2f6d3079abd39aefd))
* 修复菜单管理回显问题 ([d9ca9ba](https://github.com/kailong321200875/vue-element-plus-admin/commit/d9ca9ba5e8111b7cc3758a8bba14f7fac45c9446))
* 升级依赖,修复vue警告 ([eafb507](https://github.com/kailong321200875/vue-element-plus-admin/commit/eafb5075d587feac0501a1adae90a176a72c240f))
### Docs
* 更新README ([28bd10f](https://github.com/kailong321200875/vue-element-plus-admin/commit/28bd10f26373ad6e139b412e08d1e2afacc4ab92))
### Styling
* 调整样式 ([09b96c7](https://github.com/kailong321200875/vue-element-plus-admin/commit/09b96c75425cd2d931e7df4ef3f330b78bf74f9e))
### Performance Improvements
* request请求根据ContentType自动转换数据 ([ef9aa62](https://github.com/kailong321200875/vue-element-plus-admin/commit/ef9aa625724b754afc565b8b1f2589376f4d5c50))
* 使用flex布局优化section区域min-height的繁琐计算 ([fbb6f9a](https://github.com/kailong321200875/vue-element-plus-admin/commit/fbb6f9ad4b6d5fac9bb95d0a9250b5a318680d99))
## [2.5.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.4...v2.5.5) (2024-01-06)
### Bug Fixes
* [#276](https://github.com/kailong321200875/vue-element-plus-admin/issues/276) ([6fbc2b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/6fbc2b0243e4aec0463a734c37591dc3de40f7db))
* el-button组件和其他部分使用到相关变量的组件无法适配主题色变化问题 ([00cac6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/00cac6a831c2a0bb2f8a9df8b9264f1cad13ddde))
### Styling
* 菜单支持超出省略号 ([a926c56](https://github.com/kailong321200875/vue-element-plus-admin/commit/a926c5607a162145f77d35762b3d6730d67b23f6))
* 菜单背景支持跟随暗黑模式 ([b34aeba](https://github.com/kailong321200875/vue-element-plus-admin/commit/b34aeba10a464a0f92752fc966386286443df53a))
### Performance Improvements
* 优化ImageCropping ([069777c](https://github.com/kailong321200875/vue-element-plus-admin/commit/069777c8801c51ab28c070b2ba3f10000e9c91b4))
* 图标选择器逻辑优化 ([c2dde25](https://github.com/kailong321200875/vue-element-plus-admin/commit/c2dde252297c94036221d5d9971781182bc2998e))
* 表格组件预览字段拆分 ([8c5858e](https://github.com/kailong321200875/vue-element-plus-admin/commit/8c5858e2c5d42db1de37d5290ea2ca784f4d4612))
## [2.5.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.3...v2.5.4) (2023-12-26)
### Types
* 修复全局组件属性类型无法推导 ([94160c0](https://github.com/kailong321200875/vue-element-plus-admin/commit/94160c0418816e560f440e259e1f0fd4742e0143))
### Bug Fixes
* Menu菜单组件显示bugrenderMenuItem返回的数组存在undefined数据导致省略菜单显示问题 ([1c63757](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c63757d55076d15ffdf21d647de393ca3c6b0be))
* useClipboard在ip地址下不能使用问题 ([f3593c4](https://github.com/kailong321200875/vue-element-plus-admin/commit/f3593c453a8b8d5eb8cbd0ed5402132b027461b9))
* 修复request请求自定义headers类型错误 ([bf2cd72](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf2cd720d0e5801603848a0b1520a928443ac549))
* 修复切换主题色缓存失败 ([1074520](https://github.com/kailong321200875/vue-element-plus-admin/commit/10745207e64d2d444636cb9d877cec9a0bebf1eb))
* 修复非正式环境打包报错 ([3a5db42](https://github.com/kailong321200875/vue-element-plus-admin/commit/3a5db42c97f382f3fc701b8f113385b38a214583))
### Styling
* 本地化图标 ([608bf50](https://github.com/kailong321200875/vue-element-plus-admin/commit/608bf50e1cae49b7f97587395f794ae351f833f0))
* 添加常见问题链接 ([16b9375](https://github.com/kailong321200875/vue-element-plus-admin/commit/16b93757d32c8ce2f611a62d6015072b0ecfc09a))
### Code Refactoring
* 新增列设置 ([7314065](https://github.com/kailong321200875/vue-element-plus-admin/commit/7314065c907f8ef4d184c1f3c724b67c30410ab9))
* 重写useEventBus ([8035151](https://github.com/kailong321200875/vue-element-plus-admin/commit/80351516ced0ec2d67c30405d4a644aca8ca4bc2))
### Performance Improvements
* 优化启动速度 ([379b340](https://github.com/kailong321200875/vue-element-plus-admin/commit/379b340750eb0d4f7816f5d7c25cbd2983fd33b9))
* 还原mock.js ([83de387](https://github.com/kailong321200875/vue-element-plus-admin/commit/83de387e2a0124804a9c99080ac841a9d6676fca))
## [2.5.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.2...v2.5.3) (2023-12-17)
### Bug Fixes
* [#374](https://github.com/kailong321200875/vue-element-plus-admin/issues/374) ([30fb2de](https://github.com/kailong321200875/vue-element-plus-admin/commit/30fb2de6f37fe0bb00b0f364da31b07a292d59a1))
* 修复cutMenu布局和top布局内容高度计算错误问题 ([8badd48](https://github.com/kailong321200875/vue-element-plus-admin/commit/8badd48a699aabd8fe510052d098fa6848ff5cbd))
* 修复动态路由多开标签页404问题 ([1c5b16f](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c5b16f529d2e60a1eefcadf3f416585d1adb93b))
* 修复类型推导错误 ([649fb17](https://github.com/kailong321200875/vue-element-plus-admin/commit/649fb17d000c0d500ffcfe1f9ab6ddd73ab7ecfa))
* 修复项目配置清楚缓存无效 ([a09ee60](https://github.com/kailong321200875/vue-element-plus-admin/commit/a09ee60bb123f5bc4bbe6d80539145d5c4b94cb8))
### Code Refactoring
* 重构描述组件样式 ([c7658d8](https://github.com/kailong321200875/vue-element-plus-admin/commit/c7658d8c70618045a7527156444ba1d564963325))
### Performance Improvements
* 优化登录记住我流程 ([2009594](https://github.com/kailong321200875/vue-element-plus-admin/commit/2009594f089722151b739598dbad5ee7fb062b6e))
## [2.5.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.1...v2.5.2) (2023-12-10)
### Bug Fixes
* 修复mock无法使用问题 ([319aaef](https://github.com/kailong321200875/vue-element-plus-admin/commit/319aaef7eec6287a0e80f25a479918d43c051810))
## [2.5.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.0...v2.5.1) (2023-12-10)
### Bug Fixes
* 修复表单回车刷新页面 ([2f64836](https://github.com/kailong321200875/vue-element-plus-admin/commit/2f6483652b5d130057b4422b0f3350542b4b4b1d))
* 表单布局方式为top时查询组件按钮位置错位 ([ca98359](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca983590da72cb13392cb8897f4045fbacbc6c8d))
### Docs
* 更新Readme ([81d2dc6](https://github.com/kailong321200875/vue-element-plus-admin/commit/81d2dc6a43df8fd5799461cdafc1b7e6054cf1e1))
### Styling
* 修改视频表格样式 ([93767b6](https://github.com/kailong321200875/vue-element-plus-admin/commit/93767b65aa7c41e28a8a79a82edd2a91d20bd176))
* 抽离BaseButton支持按钮修改主题色 ([69539ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/69539ee2d34ddfcb83cbfb25e218b94891196e76))
### Performance Improvements
* [#344](https://github.com/kailong321200875/vue-element-plus-admin/issues/344) ([7fa533b](https://github.com/kailong321200875/vue-element-plus-admin/commit/7fa533b8ba0d886c0009b350a3b5fe4b027a9126))
## [2.5.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.4.1...v2.5.0) (2023-12-03)
### Types
* 删除无用类型 ([30e4214](https://github.com/kailong321200875/vue-element-plus-admin/commit/30e421438793b8283a0113ba50eb9aef90cfed4e))
### Features
* VideoPlayer ([7b5bbed](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b5bbedbccf56049ff611005ba17a0f07b07034d))
* 持久化缓存 ([893459d](https://github.com/kailong321200875/vue-element-plus-admin/commit/893459da7cf819b6b94477cd76fdfeeecacc287f))
* 新增ImageCropping ([b0a43a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0a43a70e6c93690ba4b0779527316f40297a45d))
* 新增userStore ([77c962e](https://github.com/kailong321200875/vue-element-plus-admin/commit/77c962ea91de68299a01680a7941cf7a73c7e4a7))
* 新增表格视频预览 ([cfc2d54](https://github.com/kailong321200875/vue-element-plus-admin/commit/cfc2d54586e73353295e7b73e2bf39e4e4d03c96))
* 替换mock-server插件 ([b8f9a99](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8f9a9940d5eb3f532421b1b85aeb1f3d9afb4b1))
* 替换mockjs ([7c76d94](https://github.com/kailong321200875/vue-element-plus-admin/commit/7c76d945be8c46b427fe65c728ae0e70ab7a5e91))
* 重新整理目录结构,mock请求 ([179ab26](https://github.com/kailong321200875/vue-element-plus-admin/commit/179ab2672fe7fff55c8a9c55fae22a4b6c362623))
### Bug Fixes
* [#367](https://github.com/kailong321200875/vue-element-plus-admin/issues/367) ([c8400ab](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8400abd9f37405127890be1c9a559edf9f251f8))
### Styling
* 格式化代码 ([31ea31d](https://github.com/kailong321200875/vue-element-plus-admin/commit/31ea31dde8a149f4fc805c08e4fca4e755c36752))
* 表单项宽度默认100% ([416de2b](https://github.com/kailong321200875/vue-element-plus-admin/commit/416de2b4d644f68d7db379c7cb1139c8a17f64d7))
### Performance Improvements
* 新增token过期示例 ([bdc8d35](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdc8d358a1ca8f5fc6b43990899834791364e4f2))
## [2.4.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.4.0...v2.4.1) (2023-11-12)
### Bug Fixes
* [#361](https://github.com/kailong321200875/vue-element-plus-admin/issues/361) ([2e7797b](https://github.com/kailong321200875/vue-element-plus-admin/commit/2e7797be68b2469d979231e6588b43d0b5bdb88b))
* Default currentSize ([af583c7](https://github.com/kailong321200875/vue-element-plus-admin/commit/af583c71b0d1760ba4ed4cfa12458820c3f4db52))
* 修复瀑布流示例图片无法展示 ([3477173](https://github.com/kailong321200875/vue-element-plus-admin/commit/3477173b7649eb43a1e64c91135b0e657a3c7888))
* 修复自动格式化无效 ([bd82108](https://github.com/kailong321200875/vue-element-plus-admin/commit/bd8210858126f945bad31b3f1e0416aa178afef1))
### Styling
* 修改样式 ([92d436b](https://github.com/kailong321200875/vue-element-plus-admin/commit/92d436b8bb95c94831fcfe30678d384c3debc052))
### Performance Improvements
* 优化权限管理 ([efc1c25](https://github.com/kailong321200875/vue-element-plus-admin/commit/efc1c25db86d28438a2c324a3dc302501e1fdf8f))
* 优化瀑布流组件 ([82eb7f1](https://github.com/kailong321200875/vue-element-plus-admin/commit/82eb7f16ad3f663be602a747b55a78f6b986da30))
## [2.4.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.3.0...v2.4.0) (2023-10-14)
### Types
* 修改类型错误 ([4760733](https://github.com/kailong321200875/vue-element-plus-admin/commit/4760733bbe39b547285894555754bae6539190f9))
### Features
* Waterfall ([d543e56](https://github.com/kailong321200875/vue-element-plus-admin/commit/d543e56efb3b3e5800ab3ec24eda25565311eda2))
### Bug Fixes
* [#342](https://github.com/kailong321200875/vue-element-plus-admin/issues/342) ([1c51221](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c512216453b17c64a09f97263fd481816badf7c))
* [#346](https://github.com/kailong321200875/vue-element-plus-admin/issues/346) ([d392868](https://github.com/kailong321200875/vue-element-plus-admin/commit/d392868c2799c2066ba606b0cdad95c011399559))
* [#355](https://github.com/kailong321200875/vue-element-plus-admin/issues/355) ([03d5e13](https://github.com/kailong321200875/vue-element-plus-admin/commit/03d5e130146a662a8a312e6c49f995f85ea0f9d3))
* **Descriptions:** Add a default value ([83b09f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/83b09f09ffafb2a6273a1c5274e22f842c202c32))
* table column 中定义 selectable 无效 ([b8e043c](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8e043c09c74fe00521ac0d7390331b9f223c797))
* Table的addColumn不能添加首列 ([240178f](https://github.com/kailong321200875/vue-element-plus-admin/commit/240178fd380402571fc056ddb9c8ae44ccb1e265))
* 修复Waterfall列数错误BUG ([1c2befa](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c2befa4ddc76c625774100e3f5dd5a68a6faa45))
* 去除控制台警告 ([4d14246](https://github.com/kailong321200875/vue-element-plus-admin/commit/4d14246de50d2ba9d652ec5ef038f4fd3597006a))
### Styling
* Descriptions样式调整 ([be73f4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/be73f4da3e4bbbacf3f748f7ebfd70f825e0d15e))
* formDemo集成图标选择器 ([99ffe6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/99ffe6a86ac9961ad5b9be0171b01acdfa0cf994))
* 修改 Search 组件图标错误 ([7c93b74](https://github.com/kailong321200875/vue-element-plus-admin/commit/7c93b74e8f3e69d6c88ef2891eb6accc99a6a1e8))
### Performance Improvements
* IconPicker新增搜索功能 ([a4d1391](https://github.com/kailong321200875/vue-element-plus-admin/commit/a4d1391390bb33d498f2ec2cc64965f1a0b0aaab))
* useClipboard ([1db2248](https://github.com/kailong321200875/vue-element-plus-admin/commit/1db22482b43f6fb7ca8321b838fb41a5b0aff62e))
* useNetwork ([88be3ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/88be3eea10196054596945af0eb9910e998dfd42))
* 优化请求例子 ([6b3d2e1](https://github.com/kailong321200875/vue-element-plus-admin/commit/6b3d2e14985c1a7a3c68001e17820d0e7a833a56))
* 完善demo ([2c4ff7d](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c4ff7d190c816a92d92f9c2dbe048436b2bf964))
* 新增请求示例 ([2762aaf](https://github.com/kailong321200875/vue-element-plus-admin/commit/2762aaf09b3616944476797a6e112c350c12a0ec))
## [2.3.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.2.0...v2.3.0) (2023-09-24)
### Features
* IconPicker ([4490d5e](https://github.com/kailong321200875/vue-element-plus-admin/commit/4490d5eeeb4389f94f90c9c45a30343324db2250))
* 表格工具栏新增列设置功能 ([9d10ba8](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d10ba821feca414b9b020322859ca4a47291005))
### Bug Fixes
* [#326](https://github.com/kailong321200875/vue-element-plus-admin/issues/326) ([c95a4e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/c95a4e0763838e843cf5ce174110a01f2baa8000))
* default interceptor response return ([c3d8540](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3d8540ab284312f24d9355072f6fb4506ed6d1d))
* 修复IconPicker BUG ([1e3aa78](https://github.com/kailong321200875/vue-element-plus-admin/commit/1e3aa789260773b1caecdaa32e1cafede22733e3))
* 修复useCrudSchemas无法自定义label ([aa5deb1](https://github.com/kailong321200875/vue-element-plus-admin/commit/aa5deb13904e45e7cb6ec7285e936b9ebae57273))
### Docs
* 更新README ([4947c82](https://github.com/kailong321200875/vue-element-plus-admin/commit/4947c82d6770f0dce2845682f0c41d853268cf82))
* 更新README ([c3624ce](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3624cee588457e7fedaab360746500337c1b2a7))
* 更新群二维码 ([ead1ab8](https://github.com/kailong321200875/vue-element-plus-admin/commit/ead1ab8c88c05593d539b56a811809382675faf5))
### Styling
* 修复样式层级问题 ([f92d2b6](https://github.com/kailong321200875/vue-element-plus-admin/commit/f92d2b60a956e1963b63e23b446a9d42096704e0))
* 修改登录样式 ([bdd31f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdd31f0621712af89d89b87ac439c3e0b398605a))
## [2.2.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.1.0...v2.2.0) (2023-08-27)
### Features
* JsonEditor ([c0f4517](https://github.com/kailong321200875/vue-element-plus-admin/commit/c0f4517b87de5a0172a057fb9da141f758cca1fa))
* 新增 useCrudSchemas demo ([ae0628e](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae0628e3af3466c7c9d7b593b825f776843de5ec))
* 新增useTagsView ([a869a45](https://github.com/kailong321200875/vue-element-plus-admin/commit/a869a457e6a8052531ce3040ae0d332d7afbb478))
### Bug Fixes
* [#316](https://github.com/kailong321200875/vue-element-plus-admin/issues/316) ([7582e4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/7582e4d12f18ae86f5ef4ff36211c364afca5763))
* [#317](https://github.com/kailong321200875/vue-element-plus-admin/issues/317) ([2095caa](https://github.com/kailong321200875/vue-element-plus-admin/commit/2095caaa854b686b57f47ee183419f42563a5a95))
* [#318](https://github.com/kailong321200875/vue-element-plus-admin/issues/318) ([4169e52](https://github.com/kailong321200875/vue-element-plus-admin/commit/4169e52baaaa43765848c29c5ce222d019e81c35))
* [#319](https://github.com/kailong321200875/vue-element-plus-admin/issues/319) ([b6ee4e5](https://github.com/kailong321200875/vue-element-plus-admin/commit/b6ee4e5d48deb3a07f289366ed3700baa3674cd6))
* 修复useValidator报错 ([4912f6c](https://github.com/kailong321200875/vue-element-plus-admin/commit/4912f6c0586249b3de7ac7d365c8ea98af7923c7))
* 修复动态路由无效 ([1452a1a](https://github.com/kailong321200875/vue-element-plus-admin/commit/1452a1afc77eb3f64cd3de91a05ddc15e40f4a06))
### Docs
* 更新README ([5b4defa](https://github.com/kailong321200875/vue-element-plus-admin/commit/5b4defa8c4be2de894b2cb50ae9ea739a10cf7d9))
* 更新群二维码 ([13aa71c](https://github.com/kailong321200875/vue-element-plus-admin/commit/13aa71c5bd5b5076599501961a24a171a9133c57))
* 更新群二维码 ([ae29e97](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae29e974bfed2214d1beda703b976cdfa63070ab))
### Styling
* 修改Descriptions样式 ([cd0e05a](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd0e05a6b9146af7ae64be62613724cd58e6c2a3))
### Code Refactoring
* 重构useValidator ([b8849da](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8849dabe2b306831f69e84db167a367570d992a))
### Performance Improvements
* 优化动态路由 ([8793588](https://github.com/kailong321200875/vue-element-plus-admin/commit/879358821d02d5e4575dfee0d189b9fee7f2e217))
* 完善useTagsView ([e0c55f4](https://github.com/kailong321200875/vue-element-plus-admin/commit/e0c55f40d4c1c47e29de6c4c7e9433efa978bf7f))
* 完善useTagsView ([175abd0](https://github.com/kailong321200875/vue-element-plus-admin/commit/175abd0aa3388e8473f6ecbf63e28133fce55bd3))
* 更新demo ([2c99cd2](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c99cd20f0c25a740ac7a3a8319f7a112e69c0d3))
## [2.1.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.0.0...v2.1.0) (2023-08-12)
### Features
* 新增多开标签页Demo ([5c253ce](https://github.com/kailong321200875/vue-element-plus-admin/commit/5c253ce803a9ef7ce03534ddd5f0865db4602378))
### Bug Fixes
* [#307](https://github.com/kailong321200875/vue-element-plus-admin/issues/307) ([4ce07e1](https://github.com/kailong321200875/vue-element-plus-admin/commit/4ce07e150c0bd3903cc5f43fcd88c2cb292d7690))
* [#311](https://github.com/kailong321200875/vue-element-plus-admin/issues/311) ([bdde4cc](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdde4ccd39d5d698d68b299c6e80546d4a8be89f))
* 修复eslint错误 ([b5e47e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/b5e47e04d8f5f889e0c46a2dced108d058ded94e))
* 修复Table插槽传参错误 ([97344e6](https://github.com/kailong321200875/vue-element-plus-admin/commit/97344e68f5abb144d9e5d4ad273108858dbcfba2))
* 修复Table组件插槽传参错误 ([c83a026](https://github.com/kailong321200875/vue-element-plus-admin/commit/c83a026d559e2854fead17d2e28fbebcf25490de))
### Docs
* 修改Readme ([ee059b7](https://github.com/kailong321200875/vue-element-plus-admin/commit/ee059b7619ad01ded9d3be20287086ddbcce3253))
* 修改Readme ([e05f5a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/e05f5a77edc175daa267e4fc6abbcfc8fec2e291))
* 修改Readme ([b0e561d](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0e561d8acd36e8780087e317cc34257956981fd))
* 修改Readme ([fced2e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/fced2e0087694445a89cf360e5e3e3013d8ca604))
* 修改README ([dce76f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/dce76f042d5243039540828a3fd982af25f37531))
* 更新群二维码 ([607ef58](https://github.com/kailong321200875/vue-element-plus-admin/commit/607ef585d010c9ade6f54d96c2a12b36099ece74))
### Styling
* 修改TabMenu样式 ([e8cd6f9](https://github.com/kailong321200875/vue-element-plus-admin/commit/e8cd6f9e1c4387c582e461cde4d59796bf17c1bd))
## [2.0.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.10.0...v2.0.0) (2023-08-06)
### ⚠ BREAKING CHANGES
* 重构完成
### Features
* 重构完成 ([76e971e](https://github.com/kailong321200875/vue-element-plus-admin/commit/76e971ef96ad4f5cc7df58abd0559898ce70207d))
### Code Refactoring
* 重构完成 ([85f8cda](https://github.com/kailong321200875/vue-element-plus-admin/commit/85f8cda19d8cafb951f211b845aad970a661dd1e))
* 重构完成 ([5d55597](https://github.com/kailong321200875/vue-element-plus-admin/commit/5d55597cca6c9d2bc6cb6211a01c161fa5f086ba))
## [1.10.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.9...v1.10.0) (2023-08-06)
### Types
* Form类型调整 ([a0f4aeb](https://github.com/kailong321200875/vue-element-plus-admin/commit/a0f4aebc5a685366cd56b1a7bb39fa614976e3bb))
* Form类型调整 ([674d760](https://github.com/kailong321200875/vue-element-plus-admin/commit/674d760029b451c0c6fc23a2aeac5c83992a0b27))
* 修改类型 ([c3ac191](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3ac1915045d4d59bca09ec6d19151bc5da342f1))
* 修改类型 ([7d0476f](https://github.com/kailong321200875/vue-element-plus-admin/commit/7d0476f47c5858019db871cff2bdd19f0210f0d4))
* 类型优化 ([283bc58](https://github.com/kailong321200875/vue-element-plus-admin/commit/283bc58d46151a8954bb81ee6bf8f499177b15fc))
* 调整类型 ([24c8af9](https://github.com/kailong321200875/vue-element-plus-admin/commit/24c8af91835fb2c8c00e7c2673fff01f098c9944))
* 迁移types ([ccbec86](https://github.com/kailong321200875/vue-element-plus-admin/commit/ccbec865568b1c9b3c3321d7071c164fdc350a0f))
* 迁移types ([46b35e4](https://github.com/kailong321200875/vue-element-plus-admin/commit/46b35e48b3e7876c74159625b5149ef663396f5c))
### Features
* axios 改造 ([3238140](https://github.com/kailong321200875/vue-element-plus-admin/commit/32381408bbe418eeaca2a975305bac80ddaa03f5))
* axios 改造 ([5807db1](https://github.com/kailong321200875/vue-element-plus-admin/commit/5807db1dc12a7ff2dbf66801a742a78974ad8f9c))
* Descriptions组件重构 ([49e415d](https://github.com/kailong321200875/vue-element-plus-admin/commit/49e415d27788cb468c96f2a828f1df7ae65b7a3c))
* Dialog组件重构 ([3701a04](https://github.com/kailong321200875/vue-element-plus-admin/commit/3701a04231af02ec7f7ef73533f3a22e707380fb))
* Form useForm 完成 ([3e4e27c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3e4e27c21fd59c944229856bee929f005d2ee140))
* Form改造 ([9c724dc](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c724dc9aad18397d5ecd00e53c3c24e142a34b5))
* Icon改版 ([882f162](https://github.com/kailong321200875/vue-element-plus-admin/commit/882f162ff21c74239b638f284f52161e5791722d))
* Radio改造 ([deeee73](https://github.com/kailong321200875/vue-element-plus-admin/commit/deeee73bcb3ad912844fddee62b1155d95d4b42b))
* Radio改造 ([83513d5](https://github.com/kailong321200875/vue-element-plus-admin/commit/83513d519d4b6b8fbfd48db266b9bd7b3a998d63))
* Search组件重构 ([a7f3702](https://github.com/kailong321200875/vue-element-plus-admin/commit/a7f370214481577ab82bf2871191dda717c7978a))
* SelectV2改造完成 ([4d04734](https://github.com/kailong321200875/vue-element-plus-admin/commit/4d04734e13f6926c16aeee421feecb0d339534f0))
* Table重构 ([94800b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/94800b0120ee05ca7d534dda3e59653f38d7fda0))
* 完善search组件demo ([cdf44a4](https://github.com/kailong321200875/vue-element-plus-admin/commit/cdf44a43a05010dbcba3a3ec0cb7c8251f16fce3))
* 拖拽表格 ([b69b8ed](https://github.com/kailong321200875/vue-element-plus-admin/commit/b69b8ed1bde36100fc86e51fcc63805d4ea21210))
* 新增TreeSelect表单项 ([de0cb43](https://github.com/kailong321200875/vue-element-plus-admin/commit/de0cb43566b9065250abbc71548ffeca4c8e8bf1))
* 新增Uload ([c181887](https://github.com/kailong321200875/vue-element-plus-admin/commit/c181887f7f0c5eecc9584edfe99e9065440bdc56))
* 新增useStorage ([dfea91c](https://github.com/kailong321200875/vue-element-plus-admin/commit/dfea91c7e1d18fa299067c62557cac61723ea861))
* 新增权限测试页 ([3fe40ba](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fe40ba62df29c2ffea9adfd65fc559489481e24))
* 新增锁屏功能 ([e2fd349](https://github.com/kailong321200875/vue-element-plus-admin/commit/e2fd349070147c57f9400fa9a413260b7707bda2))
* 用户列表重构 ([755cea0](https://github.com/kailong321200875/vue-element-plus-admin/commit/755cea0990d9e3b64c936f29c02e4053393a1a19))
* 登录页改造 ([5312951](https://github.com/kailong321200875/vue-element-plus-admin/commit/5312951359b5d919b6c1a03783aa6bbaf8ec0044))
* 综合示例重构 ([9a0259d](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a0259de5c47970502db95f4dda24998ad5d9efe))
* 菜单管理 ([c72b3a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/c72b3a33aab7d3605770a64d23b8a84ef4ad68d2))
* 角色管理 ([47016a5](https://github.com/kailong321200875/vue-element-plus-admin/commit/47016a535f2b7a22ab498bee197bc30a983f507d))
* 部门管理 ([28d0785](https://github.com/kailong321200875/vue-element-plus-admin/commit/28d0785be842022cae7808c23e1f19eaab5fb996))
* 重构Dialog组件示例 ([9a78ac9](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a78ac977eb0cfb3bd6c2a9b96e69d9f010017f4))
### Bug Fixes
* mock数据 ([8bdac71](https://github.com/kailong321200875/vue-element-plus-admin/commit/8bdac7152f463cd98c50c9893a46bb6c111fd428))
* 修复Form已知问题 ([097b32e](https://github.com/kailong321200875/vue-element-plus-admin/commit/097b32e1a9d92a609a66179d68b3dabe12f96b66))
* 修复Table组件已知问题 ([b1a83f6](https://github.com/kailong321200875/vue-element-plus-admin/commit/b1a83f601838cb82fb29c036654a4cdc729997cd))
* 修复类型错误 ([26dc886](https://github.com/kailong321200875/vue-element-plus-admin/commit/26dc886f8ccb5cf1ffc10e1d9601c827a1f960c2))
* 样式问题修复 ([cdc7c76](https://github.com/kailong321200875/vue-element-plus-admin/commit/cdc7c76eb5ac3ccb79f5f55ff5b7ce6b8c4955e1))
* 解决类型检测报错 ([9d93496](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d9349600b3d2008e4216d49c9fa1c1b9995fa79))
* 解决类型检测报错 ([513108c](https://github.com/kailong321200875/vue-element-plus-admin/commit/513108c00e622812e2e70dfe833435f6b5462d6e))
* 解决类型检测报错 ([28bf8be](https://github.com/kailong321200875/vue-element-plus-admin/commit/28bf8bee45e3cc8575a356623abdbe56e30991f8))
### Styling
* Table样式修改 ([5fc57bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/5fc57bdb08488f6898eafd6f28289b0567d6d9e2))
* Table样式修改 ([411c0f7](https://github.com/kailong321200875/vue-element-plus-admin/commit/411c0f792ae8359c49e81974d8193f049120985b))
* Table样式修改 ([d487c6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d487c6a93ec0281d76a3938e6e23ea2a4a7940c1))
* Table样式修改 ([c7d21e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/c7d21e36d012377ba863ac848d77abb5db4f475a))
* Table样式修改 ([7f5078a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7f5078a436c4d5abcaf7a420df35d2be9b3680c5))
* 修改Dialog样式 ([e451bfc](https://github.com/kailong321200875/vue-element-plus-admin/commit/e451bfcde6e5a47d4b3022e240ffcc0576ebb9a8))
* 修改样式 ([207c5b3](https://github.com/kailong321200875/vue-element-plus-admin/commit/207c5b3fc4e52bb06baa36cd4b659e14893785ba))
* 完善角色管理 ([c4576bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/c4576bd57bcf504733f20188202ea7d33ab1c184))
* 布局样式优化 ([962689a](https://github.com/kailong321200875/vue-element-plus-admin/commit/962689a8bd0ed5eb17d946b8a21dec4a197f13a7))
* 样式布局调整完成 ([7193176](https://github.com/kailong321200875/vue-element-plus-admin/commit/719317694f71e22692256bb557070343f034ffe5))
* 用户管理样式修改 ([57a5fa7](https://github.com/kailong321200875/vue-element-plus-admin/commit/57a5fa7b82ae9f3d7a1f8ec5391f14b1d1cd32e8))
* 移除不必要样式 ([7ef1d1e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ef1d1e3013cc5bf7fc574e67c2004f50792e66d))
* 移除不必要样式 ([366db45](https://github.com/kailong321200875/vue-element-plus-admin/commit/366db4528254d18659e6a922817702b5b92a57b0))
* 调整Icon悬停样式 ([64c7e48](https://github.com/kailong321200875/vue-element-plus-admin/commit/64c7e48bd18ba83e605daccbc4c2f4cc6b58695d))
* 调整工作台样式错乱 ([cc18f29](https://github.com/kailong321200875/vue-element-plus-admin/commit/cc18f297ef50655d5773d01fcfddabc365dc53e7))
### Performance Improvements
* Dialog默认高度修改 ([0e04fce](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e04fce4367d6829e8de97a249318b0309e06fd5))
* Form Table Search Descriptions 支持嵌套赋值 ([46ddf62](https://github.com/kailong321200875/vue-element-plus-admin/commit/46ddf62d2d4ce1a653f47695cb0bb3475aa16bd8))
* ImageViewer组件优化 ([3b9c3d8](https://github.com/kailong321200875/vue-element-plus-admin/commit/3b9c3d8b757646eaf74625403112a969bfd15e55))
* 优化Form事件传递 ([69cafb3](https://github.com/kailong321200875/vue-element-plus-admin/commit/69cafb3b7b2ce7ecbd9f2e8ef09e250817e9a55c))
* 优化Search组件 ([e548668](https://github.com/kailong321200875/vue-element-plus-admin/commit/e548668ccef8c41d9ac7d9fe39ffe66471d160d2))
* 优化表单组件 ([77a3866](https://github.com/kailong321200875/vue-element-plus-admin/commit/77a38662488ab9ff4cbe5ff3cf9b65eea34abca1))
* 优化锁屏组件 ([4f8330a](https://github.com/kailong321200875/vue-element-plus-admin/commit/4f8330a4faf6cc98a9bac17bd3e1719ae1b30c81))
## [1.9.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.8...v1.9.9) (2023-04-13)

View File

@ -1,13 +0,0 @@
FROM node:18.0.0
WORKDIR /app
RUN npm install -g pnpm@8.1.0
COPY package.json .
RUN pnpm install
COPY . .
CMD [ "pnpm", "run", "dev" ]

View File

@ -1,6 +1,6 @@
<div align="center"> <a href="https://github.com/kailong321200875/vue-element-plus-admin"> <img width="100" src="./public/logo.png"> </a> <br> <br>
[![license](https://img.shields.io/github/license/kailong321200875/vue-element-plus-admin.svg)](LICENSE) [![repo-size](https://img.shields.io/github/repo-size/kailong321200875/vue-element-plus-admin.svg)](repo-size) [![last-commit](https://img.shields.io/github/last-commit/kailong321200875/vue-element-plus-admin.svg)](last-commit) [![stars](https://img.shields.io/github/stars/kailong321200875/vue-element-plus-admin.svg)](stars) [![forks](https://img.shields.io/github/forks/kailong321200875/vue-element-plus-admin.svg)](forks) [![release](https://img.shields.io/github/release/kailong321200875/vue-element-plus-admin.svg)](release) [![watchers](https://img.shields.io/github/watchers/kailong321200875/vue-element-plus-admin.svg)](watchers)
[![license](https://img.shields.io/github/license/kailong321200875/vue-element-plus-admin.svg)](LICENSE)
<h1>vue-element-plus-admin</h1>
</div>
@ -9,11 +9,11 @@
## Introduction
vue-element-plus-admin is a free and open source middle and background template based on `element-plus`. Developed using the latest mainstream technologies such as `vue3`, `vite` and `typescript`, the out of the box middle and background front-end solution can be used as the starting template of the project and learning reference. And always pay attention to the latest technological trends and update them as soon as possible.
vue-element-plus-admin is a free and open source middle and background template based on `element-plus`. Developed using the latest mainstream technologies such as `vue3`, `vite4` and `typescript`, the out of the box middle and background front-end solution can be used as the starting template of the project and learning reference. And always pay attention to the latest technological trends and update them as soon as possible.
vue-element-plus-admin is positioned as a background integration scheme, which is not suitable for secondary development as a basic template. Because it integrates many functions that you may not use, it will cause a lot of code redundancy. If your project doesn't pay attention to this problem, you can also directly carry out secondary development based on it.
If you need a basic template, please switch to the `mini` branch. `mini` simply integrates some common layout functions such as layout and dynamic menu, which is more suitable for developers to carry out secondary development.
If you need a basic template, please switch to the `tempalte` branch. `Tempalte` simply integrates some common layout functions such as layout and dynamic menu, which is more suitable for developers to carry out secondary development.
## Feature
@ -31,9 +31,11 @@ If you need a basic template, please switch to the `mini` branch. `mini` simply
- [vue-element-plus-admin](https://element-plus-admin.cn/) - Full version of the github site
- [vue-element-plus-admin](https://kailong110120130.gitee.io/vue-element-plus-admin) - Full version of the gitee site
account: **admin/admin**
account: **admin/admin test/test**
Online examples do not apply to menu filtering by default, but directly use Static routing
`admin` account is used to simulate the control permission of the server, and render whatever the server returns
`test` account is used to simulate the front-end control authority. The server only returns the menu key to be displayed, and the front-end performs matching rendering
## Documentation
@ -44,7 +46,7 @@ Online examples do not apply to menu filtering by default, but directly use Stat
## Preparation
- [node](http://nodejs.org/) and [git](https://git-scm.com/) - Project development environment
- [Vite](https://vitejs.dev/) - Familiar with vite features
- [Vite4](https://vitejs.dev/) - Familiar with vite features
- [Vue3](https://v3.vuejs.org/) - Familiar with Vue basic syntax
- [TypeScript](https://www.typescriptlang.org/) - Familiar with the basic syntax of `TypeScript`
- [Es6+](http://es6.ruanyifeng.com/) - Familiar with es6 basic syntax
@ -87,10 +89,6 @@ pnpm run build:pro
## How to contribute
<a href="https://github.com/kailong321200875/vue-element-plus-admin/graphs/contributors">
<img src="https://contrib.rocks/image?repo=kailong321200875/vue-element-plus-admin" />
</a>
You can [Raise an issue](https://github.com/kailong321200875/vue-element-plus-admin/issues/new) Or submit a Pull Request.
**Pull Request:**
@ -129,20 +127,6 @@ Support modern browsers, not IE
| :-: | :-: | :-: | :-: | :-: |
| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
## Donate
If you find this project helpful, welcome sponsorship to show your support~
[Paypal Me](https://www.paypal.com/paypalme/ckl94)
<img src="https://github.com/kailong321200875/my-image/raw/master/pay.jpg" />
### My QR code
If you have any project cooperation or outsourcing, please scan the code to add me as a friend and leave a note of your purpose.
<img src="https://github.com/kailong321200875/my-image/raw/master/me.jpg" />
## License
[MIT](./LICENSE)

View File

@ -1,6 +1,6 @@
<div align="center"> <a href="https://github.com/kailong321200875/vue-element-plus-admin"> <img width="100" src="./public/logo.png"> </a> <br> <br>
[![license](https://img.shields.io/github/license/kailong321200875/vue-element-plus-admin.svg)](LICENSE) [![repo-size](https://img.shields.io/github/repo-size/kailong321200875/vue-element-plus-admin.svg)](repo-size) [![last-commit](https://img.shields.io/github/last-commit/kailong321200875/vue-element-plus-admin.svg)](last-commit) [![stars](https://img.shields.io/github/stars/kailong321200875/vue-element-plus-admin.svg)](stars) [![forks](https://img.shields.io/github/forks/kailong321200875/vue-element-plus-admin.svg)](forks) [![release](https://img.shields.io/github/release/kailong321200875/vue-element-plus-admin.svg)](release) [![watchers](https://img.shields.io/github/watchers/kailong321200875/vue-element-plus-admin.svg)](watchers)
[![license](https://img.shields.io/github/license/kailong321200875/vue-element-plus-admin.svg)](LICENSE)
<h1>vue-element-plus-admin</h1>
</div>
@ -9,11 +9,11 @@
## 介绍
vue-element-plus-admin 是一个基于 `element-plus` 免费开源的中后台模版。使用了最新的`vue3``vite``TypeScript`等主流技术开发,开箱即用的中后台前端解决方案,可以用来作为项目的启动模版,也可用于学习参考。并且时刻关注着最新技术动向,尽可能的第一时间更新。
vue-element-plus-admin 是一个基于 `element-plus` 免费开源的中后台模版。使用了最新的`vue3``vite4``TypeScript`等主流技术开发,开箱即用的中后台前端解决方案,可以用来作为项目的启动模版,也可用于学习参考。并且时刻关注着最新技术动向,尽可能的第一时间更新。
vue-element-plus-admin 的定位是后台集成方案,不太适合当基础模板来进行二次开发。因为集成了很多你可能用不到的功能,会造成不少的代码冗余。如果你的项目不关注这方面的问题,也可以直接基于它进行二次开发。
如需要基础模版,请切换到 `mini` 分支,`mini` 只简单集成了一些如:布局、动态菜单等常用布局功能,更适合开发者进行二次开发。
如需要基础模版,请切换到 `tempalte` 分支,`tempalte` 只简单集成了一些如:布局、动态菜单等常用布局功能,更适合开发者进行二次开发。
## 特性
@ -31,9 +31,11 @@ vue-element-plus-admin 的定位是后台集成方案,不太适合当基础模
- [vue-element-plus-admin](https://element-plus-admin.cn/) - 完整版 github 站点
- [vue-element-plus-admin](https://kailong110120130.gitee.io/vue-element-plus-admin) - 完整版 gitee 站点
帐号:**admin/admin**
帐号:**admin/admin test/test**
在线例子默认不适用菜单过滤,而是直接使用静态路由表
`admin` 帐号用于模拟服务端控制权限,服务端返回什么就渲染什么
`test` 帐号用于模拟前端控制权限,服务端只返回需要显示的菜单 key前端进行匹配渲染
## 文档
@ -44,7 +46,7 @@ vue-element-plus-admin 的定位是后台集成方案,不太适合当基础模
## 前序准备
- [node](http://nodejs.org/) 和 [git](https://git-scm.com/) - 项目开发环境
- [Vite](https://vitejs.dev/) - 熟悉 vite 特性
- [Vite4](https://vitejs.dev/) - 熟悉 vite 特性
- [Vue3](https://v3.vuejs.org/) - 熟悉 Vue 基础语法
- [TypeScript](https://www.typescriptlang.org/) - 熟悉 `TypeScript` 基本语法
- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 es6 基本语法
@ -87,10 +89,6 @@ pnpm run build:pro
## 如何贡献
<a href="https://github.com/kailong321200875/vue-element-plus-admin/graphs/contributors">
<img src="https://contrib.rocks/image?repo=kailong321200875/vue-element-plus-admin" />
</a>
你可以[提一个 issue](https://github.com/kailong321200875/vue-element-plus-admin/issues/new) 或者提交一个 Pull Request。
**Pull Request:**
@ -129,20 +127,6 @@ pnpm run build:pro
| :-: | :-: | :-: | :-: | :-: |
| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
## Donate
如果你觉得这个项目有帮助,欢迎赞助以示支持~
[Paypal Me](https://www.paypal.com/paypalme/ckl94)
<img src="https://gitee.com/kailong110120130/my-image/raw/master/pay.jpg" />
### 我的二维码
如有项目合作或项目外包,扫码加我好友,请备注来意。
<img src="https://gitee.com/kailong110120130/my-image/raw/master/me.jpg" />
## 许可证
[MIT](./LICENSE)

View File

@ -1,10 +0,0 @@
services:
vue-element-plus-admin:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "4000:4000"
volumes:
- /app/node_modules
- .:/app

View File

@ -1,82 +0,0 @@
// 引入vue模版的eslint
import pluginVue from 'eslint-plugin-vue'
import eslint from '@eslint/js'
// ts-eslint解析器使 eslint 可以解析 ts 语法
import tseslint from 'typescript-eslint'
// vue文件解析器
import vueParser from 'vue-eslint-parser'
import prettier from 'eslint-plugin-prettier'
export default tseslint.config({
// ignores: ['node_modules', 'prettier.config.cjs', 'dist*'],
files: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'],
// tseslint.config添加了extends扁平函数直接用。否则是eslint9.0版本是没有extends的
extends: [
eslint.configs.recommended,
...tseslint.configs.recommended,
...pluginVue.configs['flat/essential']
],
plugins: {
prettier
},
languageOptions: {
parser: vueParser, // 使用vue解析器这个可以识别vue文件
parserOptions: {
parser: tseslint.parser, // 在vue文件上使用ts解析器
sourceType: 'module',
ecmaVersion: 2020,
ecmaFeatures: {
jsx: true
}
}
},
rules: {
'prettier/prettier': 'error',
'no-useless-escape': 0,
'no-undef': 0,
'@typescript-eslint/no-unused-expressions': 0,
'@typescript-eslint/no-unsafe-function-type': 0,
'vue/no-setup-props-destructure': 0,
'vue/script-setup-uses-vars': 1,
'vue/no-reserved-component-names': 0,
'@typescript-eslint/ban-ts-ignore': 0,
'@typescript-eslint/explicit-function-return-type': 0,
'@typescript-eslint/no-explicit-any': 0,
'@typescript-eslint/no-var-requires': 0,
'@typescript-eslint/no-empty-function': 0,
'vue/custom-event-name-casing': 0,
'no-use-before-define': 0,
'@typescript-eslint/no-use-before-define': 0,
'@typescript-eslint/ban-ts-comment': 0,
'@typescript-eslint/ban-types': 0,
'@typescript-eslint/no-non-null-assertion': 0,
'@typescript-eslint/explicit-module-boundary-types': 0,
'@typescript-eslint/no-unused-vars': 0,
'no-unused-vars': 0,
'space-before-function-paren': 0,
'vue/attributes-order': 0,
'vue/one-component-per-file': 0,
'vue/html-closing-bracket-newline': 0,
'vue/max-attributes-per-line': 0,
'vue/multiline-html-element-content-newline': 0,
'vue/singleline-html-element-content-newline': 0,
'vue/attribute-hyphenation': 0,
'vue/require-default-prop': 0,
'vue/require-explicit-emits': 0,
'vue/html-self-closing': [
1,
{
html: {
void: 'always',
normal: 'never',
component: 'always'
},
svg: 'always',
math: 'always'
}
],
'vue/multi-word-component-names': 0,
'vue/no-v-html': 0,
'vue/require-toggle-inside-transition': 0
}
})

View File

@ -1,87 +0,0 @@
import { SUCCESS_CODE } from '@/constants'
import { MockMethod } from 'vite-plugin-mock'
const timeout = 1000
export default [
// 分析页统计接口
{
url: '/mock/analysis/total',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: {
users: 102400,
messages: 81212,
moneys: 9280,
shoppings: 13600
}
}
}
},
// 用户来源
{
url: '/mock/analysis/userAccessSource',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: [
{ value: 1000, name: 'analysis.directAccess' },
{ value: 310, name: 'analysis.mailMarketing' },
{ value: 234, name: 'analysis.allianceAdvertising' },
{ value: 135, name: 'analysis.videoAdvertising' },
{ value: 1548, name: 'analysis.searchEngines' }
]
}
}
},
// 每周用户活跃量
{
url: '/mock/analysis/weeklyUserActivity',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: [
{ value: 13253, name: 'analysis.monday' },
{ value: 34235, name: 'analysis.tuesday' },
{ value: 26321, name: 'analysis.wednesday' },
{ value: 12340, name: 'analysis.thursday' },
{ value: 24643, name: 'analysis.friday' },
{ value: 1322, name: 'analysis.saturday' },
{ value: 1324, name: 'analysis.sunday' }
]
}
}
},
// 每月销售额
{
url: '/mock/analysis/monthlySales',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: [
{ estimate: 100, actual: 120, name: 'analysis.january' },
{ estimate: 120, actual: 82, name: 'analysis.february' },
{ estimate: 161, actual: 91, name: 'analysis.march' },
{ estimate: 134, actual: 154, name: 'analysis.april' },
{ estimate: 105, actual: 162, name: 'analysis.may' },
{ estimate: 160, actual: 140, name: 'analysis.june' },
{ estimate: 165, actual: 145, name: 'analysis.july' },
{ estimate: 114, actual: 250, name: 'analysis.august' },
{ estimate: 163, actual: 134, name: 'analysis.september' },
{ estimate: 185, actual: 56, name: 'analysis.october' },
{ estimate: 118, actual: 99, name: 'analysis.november' },
{ estimate: 123, actual: 123, name: 'analysis.december' }
]
}
}
}
] as MockMethod[]

View File

@ -1,206 +0,0 @@
import { toAnyString } from '@/utils'
import Mock from 'mockjs'
import { SUCCESS_CODE } from '@/constants'
const departmentList: any = []
const citys = ['厦门总公司', '北京分公司', '上海分公司', '福州分公司', '深圳分公司', '杭州分公司']
for (let i = 0; i < 5; i++) {
departmentList.push({
// 部门名称
departmentName: citys[i],
id: toAnyString(),
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
// 备注
remark: '@cword(10, 15)',
children: [
{
// 部门名称
departmentName: '研发部',
id: toAnyString(),
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
// 备注
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '产品部',
id: toAnyString(),
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
// 备注
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '运营部',
id: toAnyString(),
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
// 备注
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '市场部',
id: toAnyString(),
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
// 备注
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '销售部',
id: toAnyString(),
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
// 备注
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '客服部',
id: toAnyString(),
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
// 备注
remark: '@cword(10, 15)'
}
]
})
}
export default [
// 列表接口
{
url: '/mock/department/list',
method: 'get',
response: () => {
return {
code: SUCCESS_CODE,
data: {
list: departmentList
}
}
}
},
{
url: '/mock/department/table/list',
method: 'get',
response: () => {
return {
code: SUCCESS_CODE,
data: {
list: departmentList,
total: 5
}
}
}
},
{
url: '/mock/department/users',
method: 'get',
timeout: 1000,
response: ({ query }) => {
const { pageSize } = query
// 根据pageSize来创建数据
const mockList: any = []
for (let i = 0; i < pageSize; i++) {
mockList.push(
Mock.mock({
// 用户名
username: '@cname',
// 账号
account: '@first',
// 邮箱
email: '@EMAIL',
// 创建时间
createTime: '@datetime',
// 用户id
id: toAnyString()
})
)
}
return {
code: SUCCESS_CODE,
data: {
total: 100,
list: mockList
}
}
}
},
// 保存接口
{
url: '/mock/department/user/save',
method: 'post',
timeout: 1000,
response: () => {
return {
code: SUCCESS_CODE,
data: 'success'
}
}
},
// 删除接口
{
url: '/mock/department/user/delete',
method: 'post',
response: ({ body }) => {
const ids = body.ids
if (!ids) {
return {
code: 500,
message: '请选择需要删除的数据'
}
} else {
return {
code: SUCCESS_CODE,
data: 'success'
}
}
}
},
// 保存接口
{
url: '/mock/department/save',
method: 'post',
timeout: 1000,
response: () => {
return {
code: SUCCESS_CODE,
data: 'success'
}
}
},
// 删除接口
{
url: '/mock/department/delete',
method: 'post',
response: ({ body }) => {
const ids = body.ids
if (!ids) {
return {
code: 500,
message: '请选择需要删除的数据'
}
} else {
return {
code: SUCCESS_CODE,
data: 'success'
}
}
}
}
]

View File

@ -1,60 +0,0 @@
import { SUCCESS_CODE } from '@/constants'
const timeout = 1000
const dictObj: Recordable = {
importance: [
{
value: 0,
label: 'tableDemo.commonly'
},
{
value: 1,
label: 'tableDemo.good'
},
{
value: 2,
label: 'tableDemo.important'
}
]
}
export default [
// 字典接口
{
url: '/mock/dict/list',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: dictObj
}
}
},
// 获取某个字典
{
url: '/mock/dict/one',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: [
{
label: 'test1',
value: 0
},
{
label: 'test2',
value: 1
},
{
label: 'test3',
value: 2
}
]
}
}
}
]

View File

@ -1,357 +0,0 @@
import Mock from 'mockjs'
import { SUCCESS_CODE } from '@/constants'
const timeout = 1000
export default [
// 列表接口
{
url: '/mock/menu/list',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: {
list: [
{
path: '/dashboard',
component: '#',
redirect: '/dashboard/analysis',
name: 'Dashboard',
status: Mock.Random.integer(0, 1),
id: 1,
type: 0,
parentId: undefined,
title: '首页',
meta: {
title: '首页',
icon: 'vi-ant-design:dashboard-filled',
alwaysShow: true
},
children: [
{
path: 'analysis',
component: 'views/Dashboard/Analysis',
name: 'Analysis',
status: Mock.Random.integer(0, 1),
id: 2,
type: 1,
parentId: 1,
title: '分析页',
permissionList: [
{
id: 1,
label: '新增',
value: 'add'
},
{
id: 2,
label: '编辑',
value: 'edit'
}
],
meta: {
title: '分析页',
noCache: true,
permission: ['add', 'edit']
}
},
{
path: 'workplace',
component: 'views/Dashboard/Workplace',
name: 'Workplace',
status: Mock.Random.integer(0, 1),
id: 3,
type: 1,
parentId: 1,
title: '工作台',
permissionList: [
{
id: 1,
label: '新增',
value: 'add'
},
{
id: 2,
label: '编辑',
value: 'edit'
},
{
id: 3,
label: '删除',
value: 'delete'
}
],
meta: {
title: '工作台',
noCache: true
}
}
]
},
{
path: '/external-link',
component: '#',
meta: {
title: '文档',
icon: 'vi-clarity:document-solid'
},
name: 'ExternalLink',
status: Mock.Random.integer(0, 1),
id: 4,
type: 0,
parentId: undefined,
title: '文档',
children: [
{
path: 'https://element-plus-admin-doc.cn/',
name: 'DocumentLink',
status: Mock.Random.integer(0, 1),
id: 5,
type: 1,
parentId: 4,
title: '文档',
meta: {
title: '文档'
}
}
]
},
{
path: '/level',
component: '#',
redirect: '/level/menu1/menu1-1/menu1-1-1',
name: 'Level',
status: Mock.Random.integer(0, 1),
id: 6,
type: 0,
parentId: undefined,
title: '菜单',
meta: {
title: '菜单',
icon: 'vi-carbon:skill-level-advanced'
},
children: [
{
path: 'menu1',
name: 'Menu1',
component: '##',
status: Mock.Random.integer(0, 1),
id: 7,
type: 0,
parentId: 6,
title: '菜单1',
redirect: '/level/menu1/menu1-1/menu1-1-1',
meta: {
title: '菜单1'
},
children: [
{
path: 'menu1-1',
name: 'Menu11',
component: '##',
status: Mock.Random.integer(0, 1),
id: 8,
type: 0,
parentId: 7,
title: '菜单1-1',
redirect: '/level/menu1/menu1-1/menu1-1-1',
meta: {
title: '菜单1-1',
alwaysShow: true
},
children: [
{
path: 'menu1-1-1',
name: 'Menu111',
component: 'views/Level/Menu111',
status: Mock.Random.integer(0, 1),
id: 9,
type: 1,
parentId: 8,
title: '菜单1-1-1',
meta: {
title: '菜单1-1-1'
}
}
]
},
{
path: 'menu1-2',
name: 'Menu12',
component: 'views/Level/Menu12',
status: Mock.Random.integer(0, 1),
id: 10,
type: 1,
parentId: 7,
title: '菜单1-2',
meta: {
title: '菜单1-2'
}
}
]
},
{
path: 'menu2',
name: 'Menu2Demo',
component: 'views/Level/Menu2',
status: Mock.Random.integer(0, 1),
id: 11,
type: 1,
parentId: 6,
title: '菜单2',
meta: {
title: '菜单2'
}
}
]
},
{
path: '/example',
component: '#',
redirect: '/example/example-dialog',
name: 'Example',
status: Mock.Random.integer(0, 1),
id: 12,
type: 0,
parentId: undefined,
title: '综合示例',
meta: {
title: '综合示例',
icon: 'vi-ep:management',
alwaysShow: true
},
children: [
{
path: 'example-dialog',
component: 'views/Example/Dialog/ExampleDialog',
name: 'ExampleDialog',
status: Mock.Random.integer(0, 1),
id: 13,
type: 1,
parentId: 12,
title: '综合示例-弹窗',
permissionList: [
{
id: 1,
label: '新增',
value: 'add'
},
{
id: 2,
label: '编辑',
value: 'edit'
},
{
id: 3,
label: '删除',
value: 'delete'
},
{
id: 4,
label: '查看',
value: 'view'
}
],
meta: {
title: '综合示例-弹窗'
}
},
{
path: 'example-page',
component: 'views/Example/Page/ExamplePage',
name: 'ExamplePage',
status: Mock.Random.integer(0, 1),
id: 14,
type: 1,
parentId: 12,
title: '综合示例-页面',
permissionList: [
{
id: 1,
label: '新增',
value: 'add'
},
{
id: 2,
label: '编辑',
value: 'edit'
},
{
id: 3,
label: '删除',
value: 'delete'
},
{
id: 4,
label: '查看',
value: 'view'
}
],
meta: {
title: '综合示例-页面'
}
},
{
path: 'example-add',
component: 'views/Example/Page/ExampleAdd',
name: 'ExampleAdd',
status: Mock.Random.integer(0, 1),
id: 15,
type: 1,
parentId: 12,
title: '综合示例-新增',
meta: {
title: '综合示例-新增',
noTagsView: true,
noCache: true,
hidden: true,
showMainRoute: true,
activeMenu: '/example/example-page'
}
},
{
path: 'example-edit',
component: 'views/Example/Page/ExampleEdit',
name: 'ExampleEdit',
status: Mock.Random.integer(0, 1),
id: 16,
type: 1,
parentId: 12,
title: '综合示例-编辑',
meta: {
title: '综合示例-编辑',
noTagsView: true,
noCache: true,
hidden: true,
showMainRoute: true,
activeMenu: '/example/example-page'
}
},
{
path: 'example-detail',
component: 'views/Example/Page/ExampleDetail',
name: 'ExampleDetail',
status: Mock.Random.integer(0, 1),
id: 17,
type: 1,
parentId: 12,
title: '综合示例-详情',
meta: {
title: '综合示例-详情',
noTagsView: true,
noCache: true,
hidden: true,
showMainRoute: true,
activeMenu: '/example/example-page'
}
}
]
}
]
}
}
}
}
]

View File

@ -1,72 +0,0 @@
import { SUCCESS_CODE } from '@/constants'
const timeout = 600000
export default [
{
url: '/mock/request/1',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: 'request-1'
}
}
},
{
url: '/mock/request/2',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: 'request-2'
}
}
},
{
url: '/mock/request/3',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: 'request-3'
}
}
},
{
url: '/mock/request/4',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: 'request-4'
}
}
},
{
url: '/mock/request/5',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: 'request-5'
}
}
},
{
url: '/mock/request/expired',
method: 'get',
timeout: 0,
response: () => {
return {
code: 401,
message: 'token expired'
}
}
}
]

File diff suppressed because it is too large Load Diff

View File

@ -1,319 +0,0 @@
import Mock from 'mockjs'
import { SUCCESS_CODE } from '@/constants'
import { toAnyString } from '@/utils'
const timeout = 1000
const count = 100
const baseContent =
'<p>I am testing data, I am testing data.</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>'
interface ListProps {
id: string
author: string
title: string
content: string
importance: number
display_time: any
pageviews: number
image_uri: string
video_uri?: string
}
interface TreeListProps {
id: string
author: string
title: string
content: string
importance: number
display_time: any
image_uri: string
pageviews: number
video_uri?: string
children?: TreeListProps[]
}
let List: ListProps[] = []
for (let i = 0; i < count; i++) {
List.push(
Mock.mock({
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(100, 500)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
video_uri:
'//sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4'
})
)
}
const treeList: TreeListProps[] = []
for (let i = 0; i < count; i++) {
treeList.push(
Mock.mock({
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
children: [
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
children: [
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
},
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
}
]
},
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
},
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
},
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
}
]
// image_uri
})
)
}
const cardList = [
{
logo: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png',
name: 'Alipay',
desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
},
{
logo: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png',
name: 'Angular',
desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
},
{
logo: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png',
name: 'Bootstrap',
desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
},
{
logo: 'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png',
name: 'React',
desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
},
{
logo: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png',
name: 'Vue',
desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
},
{
logo: 'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png',
name: 'Webpack',
desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
}
]
export default [
// 树形列表接口
{
url: '/mock/example/treeList',
method: 'get',
timeout,
response: ({ query }) => {
const { title, pageIndex, pageSize } = query
const mockList = treeList.filter((item) => {
if (title && item.title.indexOf(title) < 0) return false
return true
})
const pageList = mockList.filter(
(_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
)
return {
code: SUCCESS_CODE,
data: {
total: mockList.length,
list: pageList
}
}
}
},
// 列表接口
{
url: '/mock/example/list',
method: 'get',
timeout,
response: ({ query }) => {
const { title, pageIndex, pageSize } = query
const mockList = List.filter((item) => {
if (title && item.title.indexOf(title) < 0) return false
return true
})
const pageList = mockList.filter(
(_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
)
return {
code: SUCCESS_CODE,
data: {
total: mockList.length,
list: pageList
}
}
}
},
// 保存接口
{
url: '/mock/example/save',
method: 'post',
timeout,
response: ({ body }) => {
if (!body.id) {
List = [
Object.assign(body, {
id: toAnyString()
})
].concat(List)
return {
code: SUCCESS_CODE,
data: 'success'
}
} else {
List.map((item) => {
if (item.id === body.id) {
for (const key in item) {
item[key] = body[key]
}
}
})
return {
code: SUCCESS_CODE,
data: 'success'
}
}
}
},
// 详情接口
{
url: '/mock/example/detail',
method: 'get',
response: ({ query }) => {
const { id } = query
for (const example of List) {
if (example.id === id) {
return {
code: SUCCESS_CODE,
data: example
}
}
}
}
},
// 删除接口
{
url: '/mock/example/delete',
method: 'post',
response: ({ body }) => {
const ids = body.ids
if (!ids) {
return {
code: 500,
message: '请选择需要删除的数据'
}
} else {
let i = List.length
while (i--) {
if (ids.indexOf(List[i].id) !== -1) {
List.splice(i, 1)
}
}
return {
code: SUCCESS_CODE,
data: 'success'
}
}
}
},
{
url: '/mock/card/list',
method: 'get',
timeout,
response: ({ query }) => {
const { name, pageIndex, pageSize } = query
const mockList = cardList.filter((item) => {
if (name && item.name.indexOf(name) < 0) return false
return true
})
const pageList = mockList.filter(
(_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
)
return {
code: SUCCESS_CODE,
data: {
total: mockList.length,
list: pageList
}
}
}
}
]

View File

@ -1,169 +0,0 @@
import { SUCCESS_CODE } from '@/constants'
const timeout = 1000
export default [
// 获取统计
{
url: '/mock/workplace/total',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: {
project: 40,
access: 2340,
todo: 10
}
}
}
},
// 获取项目
{
url: '/mock/workplace/project',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: [
{
name: 'Github',
icon: 'akar-icons:github-fill',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'Vue',
icon: 'logos:vue',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'Angular',
icon: 'logos:angular-icon',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'React',
icon: 'logos:react',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'Webpack',
icon: 'logos:webpack',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'Vite',
icon: 'vscode-icons:file-type-vite',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
}
]
}
}
},
// 获取动态
{
url: '/mock/workplace/dynamic',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: [
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
}
]
}
}
},
// 获取团队信息
{
url: '/mock/workplace/team',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: [
{
name: 'Github',
icon: 'akar-icons:github-fill'
},
{
name: 'Vue',
icon: 'logos:vue'
},
{
name: 'Angular',
icon: 'logos:angular-icon'
},
{
name: 'React',
icon: 'logos:react'
},
{
name: 'Webpack',
icon: 'logos:webpack'
},
{
name: 'Vite',
icon: 'vscode-icons:file-type-vite'
}
]
}
}
},
// 获取指数
{
url: '/mock/workplace/radar',
method: 'get',
timeout,
response: () => {
return {
code: SUCCESS_CODE,
data: [
{ name: 'workplace.quote', max: 65, personal: 42, team: 50 },
{ name: 'workplace.contribution', max: 160, personal: 30, team: 140 },
{ name: 'workplace.hot', max: 300, personal: 20, team: 28 },
{ name: 'workplace.yield', max: 130, personal: 35, team: 35 },
{ name: 'workplace.follow', max: 100, personal: 80, team: 90 }
]
}
}
}
]

View File

@ -1,10 +1,9 @@
{
"name": "vue-element-plus-admin",
"version": "2.8.1",
"version": "2.5.6",
"description": "一套基于vue3、element-plus、typesScript、vite4的后台集成方案。",
"author": "Archer <502431556@qq.com>",
"private": false,
"type": "module",
"scripts": {
"i": "pnpm install",
"dev": "pnpm vite --mode base",
@ -19,99 +18,95 @@
"npm:check": "pnpx npm-check-updates -u",
"clean": "pnpx rimraf node_modules",
"clean:cache": "pnpx rimraf node_modules/.cache",
"lint:eslint": "eslint . --fix \"src/**/*.{js,ts,tsx,vue,html}\"",
"lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src",
"lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,vue,html,md}\"",
"lint:style": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
"lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.cjs",
"lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js",
"prepare": "husky install",
"p": "plop",
"icon": "esno ./scripts/icon.ts"
"p": "plop"
},
"dependencies": {
"@faker-js/faker": "^8.4.0",
"@iconify/iconify": "^3.1.1",
"@iconify/vue": "^4.3.0",
"@vueuse/core": "^12.3.0",
"@iconify/vue": "^4.1.1",
"@vueuse/core": "^10.7.2",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.10",
"@zxcvbn-ts/core": "^3.0.4",
"animate.css": "^4.1.1",
"axios": "^1.7.9",
"cropperjs": "^1.6.2",
"dayjs": "^1.11.13",
"axios": "^1.6.7",
"cropperjs": "^1.6.1",
"dayjs": "^1.11.10",
"driver.js": "^1.3.1",
"echarts": "^5.6.0",
"echarts": "^5.4.3",
"echarts-wordcloud": "^2.1.0",
"element-plus": "2.9.2",
"element-plus": "2.5.5",
"lodash-es": "^4.17.21",
"mitt": "^3.0.1",
"monaco-editor": "^0.52.2",
"nprogress": "^0.2.0",
"pinia": "^2.3.0",
"pinia-plugin-persistedstate": "^4.2.0",
"qrcode": "^1.5.4",
"qs": "^6.13.1",
"url": "^0.11.4",
"vue": "3.5.13",
"vue-draggable-plus": "^0.6.0",
"vue-i18n": "11.0.1",
"vue-json-pretty": "^2.4.0",
"vue-router": "^4.5.0",
"vue-types": "^5.1.3",
"xgplayer": "^3.0.20"
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1",
"qrcode": "^1.5.3",
"qs": "^6.11.2",
"url": "^0.11.3",
"vue": "3.4.15",
"vue-draggable-plus": "^0.3.5",
"vue-i18n": "9.9.1",
"vue-json-pretty": "^2.3.0",
"vue-router": "^4.2.5",
"vue-types": "^5.1.1",
"xgplayer": "^3.0.12"
},
"devDependencies": {
"@commitlint/cli": "^19.6.1",
"@commitlint/config-conventional": "^19.6.0",
"@iconify/json": "^2.2.293",
"@intlify/unplugin-vue-i18n": "^6.0.3",
"@commitlint/cli": "^18.6.0",
"@commitlint/config-conventional": "^18.6.0",
"@iconify/json": "^2.2.180",
"@intlify/unplugin-vue-i18n": "^2.0.0",
"@types/fs-extra": "^11.0.4",
"@types/inquirer": "^9.0.7",
"@types/lodash-es": "^4.17.12",
"@types/mockjs": "^1.0.10",
"@types/node": "^22.10.5",
"@types/node": "^20.11.16",
"@types/nprogress": "^0.2.3",
"@types/qrcode": "^1.5.5",
"@types/qs": "^6.9.17",
"@types/sortablejs": "^1.15.8",
"@typescript-eslint/eslint-plugin": "^8.19.1",
"@typescript-eslint/parser": "^8.19.1",
"@unocss/transformer-variant-group": "^0.65.4",
"@vitejs/plugin-legacy": "^6.0.0",
"@vitejs/plugin-vue": "^5.2.1",
"@vitejs/plugin-vue-jsx": "^4.1.1",
"autoprefixer": "^10.4.20",
"chalk": "^5.4.1",
"consola": "^3.3.3",
"eslint": "^9.17.0",
"@types/qs": "^6.9.11",
"@types/sortablejs": "^1.15.7",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"@unocss/transformer-variant-group": "^0.58.5",
"@vitejs/plugin-legacy": "^5.3.0",
"@vitejs/plugin-vue": "^5.0.3",
"@vitejs/plugin-vue-jsx": "^3.1.0",
"autoprefixer": "^10.4.17",
"chalk": "^5.3.0",
"consola": "^3.2.3",
"eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0",
"eslint-define-config": "^2.1.0",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-vue": "^9.32.0",
"esno": "^4.8.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-vue": "^9.21.1",
"esno": "^4.0.0",
"fs-extra": "^11.2.0",
"husky": "^9.1.7",
"inquirer": "^12.3.0",
"less": "^4.2.1",
"lint-staged": "^15.3.0",
"mockjs": "^1.1.0",
"husky": "^9.0.10",
"inquirer": "^9.2.14",
"less": "^4.2.0",
"lint-staged": "^15.2.2",
"plop": "^4.0.1",
"postcss": "^8.4.49",
"postcss-html": "^1.7.0",
"postcss": "^8.4.34",
"postcss-html": "^1.6.0",
"postcss-less": "^6.0.0",
"prettier": "^3.4.2",
"rimraf": "^6.0.1",
"rollup": "^4.30.1",
"rollup-plugin-visualizer": "^5.14.0",
"stylelint": "^16.12.0",
"prettier": "^3.2.5",
"rimraf": "^5.0.5",
"rollup": "^4.9.6",
"rollup-plugin-visualizer": "^5.12.0",
"stylelint": "^16.2.1",
"stylelint-config-html": "^1.1.0",
"stylelint-config-recommended": "^14.0.1",
"stylelint-config-standard": "^36.0.1",
"stylelint-config-recommended": "^14.0.0",
"stylelint-config-standard": "^36.0.0",
"stylelint-order": "^6.0.4",
"terser": "^5.37.0",
"typescript": "5.7.3",
"typescript-eslint": "^8.19.1",
"unocss": "^0.65.4",
"vite": "6.0.7",
"terser": "^5.27.0",
"typescript": "5.3.3",
"unocss": "^0.58.5",
"vite": "5.0.12",
"vite-plugin-ejs": "^1.7.0",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-mock": "2.9.6",
@ -119,10 +114,9 @@
"vite-plugin-purge-icons": "^0.10.0",
"vite-plugin-style-import": "2.0.0",
"vite-plugin-svg-icons": "^2.0.1",
"vite-plugin-url-copy": "^1.1.4",
"vue-tsc": "^2.2.0"
"vue-tsc": "^1.8.27"
},
"packageManager": "pnpm@9.15.3",
"packageManager": "pnpm@8.1.0",
"engines": {
"node": ">=18.0.0",
"pnpm": ">=8.1.0"

View File

@ -1,5 +1,5 @@
const viewGenerator = require('./plop/view/prompt.cjs')
const componentGenerator = require('./plop/component/prompt.cjs')
const viewGenerator = require('./plop/view/prompt.js')
const componentGenerator = require('./plop/component/prompt.js')
module.exports = function (plop) {
plop.setGenerator('view', viewGenerator)

File diff suppressed because it is too large Load Diff

View File

@ -1,73 +0,0 @@
import path from 'path'
import fs from 'fs-extra'
import inquirer from 'inquirer'
import chalk from 'chalk'
import pkg from '../package.json'
import { ICON_PREFIX } from '../src/constants'
interface Icon {
name: string
prefix: string
icons: string[]
}
async function generateIcon() {
const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json')
const raw = await fs.readJSON(path.join(dir, 'collections.json'))
const collections = Object.entries(raw).map(([id, v]) => ({
...(v as any),
id
}))
const choices = collections.map((item) => ({ key: item.id, value: item.id, name: item.name }))
inquirer
.prompt([
// {
// type: 'list',
// name: 'useType',
// choices: [
// { key: 'local', value: 'local', name: 'Local' },
// { key: 'onLine', value: 'onLine', name: 'OnLine' }
// ],
// message: 'How to use icons?'
// },
{
type: 'list',
name: 'iconSet',
choices: choices,
message: 'Select the icon set that needs to be generated?'
}
])
// ↓命令行问答的答案
.then(async (answers) => {
const { iconSet } = answers
// const isOnLine = useType === 'onLine'
const outputDir = path.resolve(process.cwd(), 'src/components/IconPicker/src/data')
fs.ensureDir(outputDir)
const genCollections = collections.filter((item) => [iconSet].includes(item.id))
const prefixSet: string[] = []
for (const info of genCollections) {
const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`))
if (data) {
const { prefix } = data
const prefixName = `${ICON_PREFIX}${prefix}`
const icons = Object.keys(data.icons).map((item) => `${prefixName}:${item}`)
await fs.writeFileSync(
path.join('src/components/IconPicker/src/data', `icons.${prefix}.ts`),
`export default ${JSON.stringify({ name: info.name, prefix: prefixName, icons })}`
)
// ↓分类处理完成push类型名称
prefixSet.push(prefix)
}
}
console.log(
`${chalk.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`
)
})
}
generateIcon()

View File

@ -3,7 +3,6 @@ import { computed } from 'vue'
import { useAppStore } from '@/store/modules/app'
import { ConfigGlobal } from '@/components/ConfigGlobal'
import { useDesign } from '@/hooks/web/useDesign'
import { ElNotification } from 'element-plus'
const { getPrefixCls } = useDesign()
@ -16,15 +15,6 @@ const currentSize = computed(() => appStore.getCurrentSize)
const greyMode = computed(() => appStore.getGreyMode)
appStore.initTheme()
ElNotification({
title: '提示',
type: 'warning',
duration: 0,
dangerouslyUseHTMLString: true,
message:
'<div><p><strong>遇事不决,请先查阅常见问题,说不定你能找到相关解答</strong></p><p><a href="https://element-plus-admin-doc.cn/guide/fqa.html" target="_blank">链接地址</a></p></div>'
})
</script>
<template>
@ -34,7 +24,7 @@ ElNotification({
</template>
<style lang="less">
@prefix-cls: ~'@{adminNamespace}-app';
@prefix-cls: ~'@{namespace}-app';
.size {
width: 100%;

View File

@ -1,11 +0,0 @@
import request from '@/axios'
// 获取所有字典
export const getDictApi = () => {
return request.get({ url: '/mock/dict/list' })
}
// 模拟获取某个字典
export const getDictOneApi = async () => {
return request.get({ url: '/mock/dict/one' })
}

View File

@ -1,23 +0,0 @@
import request from '@/axios'
import type {
AnalysisTotalTypes,
UserAccessSource,
WeeklyUserActivity,
MonthlySales
} from './types'
export const getCountApi = (): Promise<IResponse<AnalysisTotalTypes[]>> => {
return request.get({ url: '/mock/analysis/total' })
}
export const getUserAccessSourceApi = (): Promise<IResponse<UserAccessSource[]>> => {
return request.get({ url: '/mock/analysis/userAccessSource' })
}
export const getWeeklyUserActivityApi = (): Promise<IResponse<WeeklyUserActivity[]>> => {
return request.get({ url: '/mock/analysis/weeklyUserActivity' })
}
export const getMonthlySalesApi = (): Promise<IResponse<MonthlySales[]>> => {
return request.get({ url: '/mock/analysis/monthlySales' })
}

View File

@ -1,22 +0,0 @@
export type AnalysisTotalTypes = {
users: number
messages: number
moneys: number
shoppings: number
}
export type UserAccessSource = {
value: number
name: string
}
export type WeeklyUserActivity = {
value: number
name: string
}
export type MonthlySales = {
name: string
estimate: number
actual: number
}

View File

@ -1,22 +0,0 @@
import request from '@/axios'
import type { WorkplaceTotal, Project, Dynamic, Team, RadarData } from './types'
export const getCountApi = (): Promise<IResponse<WorkplaceTotal>> => {
return request.get({ url: '/mock/workplace/total' })
}
export const getProjectApi = (): Promise<IResponse<Project>> => {
return request.get({ url: '/mock/workplace/project' })
}
export const getDynamicApi = (): Promise<IResponse<Dynamic[]>> => {
return request.get({ url: '/mock/workplace/dynamic' })
}
export const getTeamApi = (): Promise<IResponse<Team[]>> => {
return request.get({ url: '/mock/workplace/team' })
}
export const getRadarApi = (): Promise<IResponse<RadarData[]>> => {
return request.get({ url: '/mock/workplace/radar' })
}

View File

@ -1,30 +0,0 @@
export type WorkplaceTotal = {
project: number
access: number
todo: number
}
export type Project = {
name: string
icon: string
message: string
personal: string
time: Date | number | string
}
export type Dynamic = {
keys: string[]
time: Date | number | string
}
export type Team = {
name: string
icon: string
}
export type RadarData = {
personal: number
team: number
max: number
name: string
}

View File

@ -1,30 +0,0 @@
import request from '@/axios'
import { DepartmentListResponse, DepartmentUserParams, DepartmentUserResponse } from './types'
export const getDepartmentApi = () => {
return request.get<DepartmentListResponse>({ url: '/mock/department/list' })
}
export const getUserByIdApi = (params: DepartmentUserParams) => {
return request.get<DepartmentUserResponse>({ url: '/mock/department/users', params })
}
export const deleteUserByIdApi = (ids: string[] | number[]) => {
return request.post({ url: '/mock/department/user/delete', data: { ids } })
}
export const saveUserApi = (data: any) => {
return request.post({ url: '/mock/department/user/save', data })
}
export const saveDepartmentApi = (data: any) => {
return request.post({ url: '/mock/department/save', data })
}
export const deleteDepartmentApi = (ids: string[] | number[]) => {
return request.post({ url: '/mock/department/delete', data: { ids } })
}
export const getDepartmentTableApi = (params: any) => {
return request.get({ url: '/mock/department/table/list', params })
}

View File

@ -1,32 +0,0 @@
export interface DepartmentItem {
id: string
departmentName: string
children?: DepartmentItem[]
}
export interface DepartmentListResponse {
list: DepartmentItem[]
}
export interface DepartmentUserParams {
pageSize: number
pageIndex: number
id: string
username?: string
account?: string
}
export interface DepartmentUserItem {
id: string
username: string
account: string
email: string
createTime: string
role: string
department: DepartmentItem
}
export interface DepartmentUserResponse {
list: DepartmentUserItem[]
total: number
}

View File

@ -13,16 +13,6 @@ export const loginOutApi = (): Promise<IResponse> => {
return request.get({ url: '/mock/user/loginOut' })
}
export const getUserListApi = ({ params }: AxiosConfig) => {
return request.get<{
code: string
data: {
list: UserType[]
total: number
}
}>({ url: '/mock/user/list', params })
}
export const getAdminRoleApi = (
params: RoleParams
): Promise<IResponse<AppCustomRouteRecordRaw[]>> => {

View File

@ -1,11 +1,12 @@
export interface UserLoginType {
export type UserLoginType = {
username: string
password: string
}
export interface UserType {
export type UserType = {
username: string
password: string
role: string
roleId: string
permissions: string | string[]
}

View File

@ -1,5 +0,0 @@
import request from '@/axios'
export const getMenuListApi = () => {
return request.get({ url: '/mock/menu/list' })
}

View File

@ -1,38 +0,0 @@
import request from '@/axios'
import { RequestResponse } from './types'
export const request1 = () => {
return request.get<IResponse<RequestResponse>>({
url: '/mock/request/1'
})
}
export const request2 = () => {
return request.get<IResponse<RequestResponse>>({
url: '/mock/request/2'
})
}
export const request3 = () => {
return request.get<IResponse<RequestResponse>>({
url: '/mock/request/3'
})
}
export const request4 = () => {
return request.get<IResponse<RequestResponse>>({
url: '/mock/request/4'
})
}
export const request5 = () => {
return request.get<IResponse<RequestResponse>>({
url: '/mock/request/5'
})
}
export const expired = () => {
return request.get<IResponse<RequestResponse>>({
url: '/mock/request/expired'
})
}

View File

@ -1,3 +0,0 @@
export interface RequestResponse {
data: string
}

View File

@ -1,5 +0,0 @@
import request from '@/axios'
export const getRoleListApi = () => {
return request.get({ url: '/mock/role/table' })
}

View File

@ -1,26 +0,0 @@
import request from '@/axios'
import type { TableData } from './types'
export const getTableListApi = (params: any) => {
return request.get({ url: '/mock/example/list', params })
}
export const getCardTableListApi = (params: any) => {
return request.get({ url: '/mock/card/list', params })
}
export const getTreeTableListApi = (params: any) => {
return request.get({ url: '/mock/example/treeList', params })
}
export const saveTableApi = (data: Partial<TableData>): Promise<IResponse> => {
return request.post({ url: '/mock/example/save', data })
}
export const getTableDetApi = (id: string): Promise<IResponse<TableData>> => {
return request.get({ url: '/mock/example/detail', params: { id } })
}
export const delTableListApi = (ids: string[] | number[]): Promise<IResponse> => {
return request.post({ url: '/mock/example/delete', data: { ids } })
}

View File

@ -1,9 +0,0 @@
export type TableData = {
id: string
author: string
title: string
content: string
importance: number
display_time: string
pageviews: number
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

View File

@ -14,8 +14,7 @@ const defaultRequestInterceptors = (config: InternalAxiosRequestConfig) => {
} else if (
TRANSFORM_REQUEST_DATA &&
config.method === 'post' &&
config.headers['Content-Type'] === 'multipart/form-data' &&
!(config.data instanceof FormData)
config.headers['Content-Type'] === 'multipart/form-data'
) {
config.data = objToFormData(config.data)
}

View File

@ -4,13 +4,12 @@ import { useUserStoreWithOut } from '@/store/modules/user'
const request = (option: AxiosConfig) => {
const { url, method, params, data, headers, responseType } = option
const userStore = useUserStoreWithOut()
return service.request({
url: url,
method,
params,
data: data,
data,
responseType: responseType,
headers: {
'Content-Type': CONTENT_TYPE,

View File

@ -18,10 +18,7 @@ axiosInstance.interceptors.request.use((res: InternalAxiosRequestConfig) => {
const controller = new AbortController()
const url = res.url || ''
res.signal = controller.signal
abortControllerMap.set(
import.meta.env.VITE_USE_MOCK === 'true' ? url.replace('/mock', '') : url,
controller
)
abortControllerMap.set(url, controller)
return res
})

View File

@ -1,4 +0,0 @@
import Avatars from './src/Avatars.vue'
export type { AvatarItem } from './src/types'
export { Avatars }

View File

@ -1,79 +0,0 @@
<script setup lang="ts">
import { ComponentSize, ElAvatar, ElTooltip } from 'element-plus'
import { PropType, computed } from 'vue'
import { AvatarItem } from './types'
import { useDesign } from '@/hooks/web/useDesign'
const { getPrefixCls } = useDesign()
const prefixCls = getPrefixCls('avatars')
const props = defineProps({
size: {
type: [String, Number] as PropType<ComponentSize | number>,
default: ''
},
max: {
type: Number,
default: 5
},
data: {
type: Array as PropType<AvatarItem[]>,
default: () => []
},
showTooltip: {
type: Boolean,
default: true
}
})
const filterData = computed(() => props.data.slice(0, props.max))
</script>
<template>
<div :class="prefixCls" class="flex items-center">
<template v-for="item in filterData" :key="item.url">
<template v-if="showTooltip && item.name">
<ElTooltip :content="item.name" placement="top">
<ElAvatar
:size="size"
:src="item.url"
class="relative"
:style="{
zIndex: filterData.indexOf(item)
}"
/>
</ElTooltip>
</template>
<template v-else>
<ElAvatar
:size="size"
:src="item.url"
class="relative"
:style="{
zIndex: filterData.indexOf(item)
}"
/>
</template>
</template>
<ElAvatar
v-if="data.length > max"
:style="{
zIndex: data.length
}"
>
<span>+{{ data.length - max }}</span>
</ElAvatar>
</div>
</template>
<style scoped lang="less">
@prefix-cls: ~'@{adminNamespace}-avatars';
.@{prefix-cls} {
.@{elNamespace}-avatar + .@{elNamespace}-avatar {
margin-left: -15px;
}
}
</style>

View File

@ -1,4 +0,0 @@
export interface AvatarItem {
url: string
name?: string
}

View File

@ -9,7 +9,7 @@ const prefixCls = getPrefixCls('backtop')
<template>
<ElBacktop
:class="prefixCls"
:class="`${prefixCls}-backtop`"
:target="`.${variables.namespace}-layout-content-scrollbar .${variables.elNamespace}-scrollbar__wrap`"
/>
</template>

View File

@ -5,7 +5,7 @@ import { useRouter } from 'vue-router'
import { usePermissionStore } from '@/store/modules/permission'
import { filterBreadcrumb } from './helper'
import { filter, treeToList } from '@/utils/tree'
import type { RouteLocationNormalizedLoaded } from 'vue-router'
import type { RouteLocationNormalizedLoaded, RouteMeta } from 'vue-router'
import { useI18n } from '@/hooks/web/useI18n'
import { Icon } from '@/components/Icon'
import { useAppStore } from '@/store/modules/app'
@ -47,15 +47,15 @@ export default defineComponent({
const breadcrumbList = treeToList<AppRouteRecordRaw[]>(unref(levelList))
return breadcrumbList.map((v) => {
const disabled = !v.redirect || v.redirect === 'noredirect'
const meta = v.meta
const meta = v.meta as RouteMeta
return (
<ElBreadcrumbItem to={{ path: disabled ? '' : v.path }} key={v.name}>
{meta?.icon && breadcrumbIcon.value ? (
<>
<Icon icon={meta.icon} class="mr-[5px]"></Icon> {t(v?.meta?.title || '')}
<Icon icon={meta.icon} class="mr-[5px]"></Icon> {t(v?.meta?.title)}
</>
) : (
t(v?.meta?.title || '')
t(v?.meta?.title)
)}
</ElBreadcrumbItem>
)

View File

@ -1,4 +1,5 @@
import { pathResolve } from '@/utils/routerHelper'
import type { RouteMeta } from 'vue-router'
export const filterBreadcrumb = (
routes: AppRouteRecordRaw[],
@ -7,7 +8,7 @@ export const filterBreadcrumb = (
const res: AppRouteRecordRaw[] = []
for (const route of routes) {
const meta = route?.meta
const meta = route?.meta as RouteMeta
if (meta.hidden && !meta.canTo) {
continue
}

View File

@ -54,11 +54,11 @@ const props = defineProps({
default: false
},
loadingIcon: {
type: [String, Object] as PropType<string | Component>,
type: [String, Object] as PropType<String | Component>,
default: undefined
},
icon: {
type: [String, Object] as PropType<string | Component>,
type: [String, Object] as PropType<String | Component>,
default: undefined
},
autofocus: {
@ -82,7 +82,7 @@ const props = defineProps({
default: false
},
tag: {
type: [String, Object] as PropType<string | Component>,
type: [String, Object] as PropType<String | Component>,
default: 'button'
}
})
@ -90,16 +90,16 @@ const props = defineProps({
const emits = defineEmits(['click'])
const color = computed(() => {
const { type, link } = props
if (type === 'primary' && !link) {
const { type } = props
if (type === 'primary') {
return unref(getTheme).elColorPrimary
}
return ''
})
const style = computed(() => {
const { type, link } = props
if (type === 'primary' && !link) {
const { type } = props
if (type === 'primary') {
return '--el-button-text-color: #fff; --el-button-hover-text-color: #fff'
}
return ''

View File

@ -1,3 +0,0 @@
import CodeEditor from './src/CodeEditor.vue'
export { CodeEditor }

View File

@ -1,119 +0,0 @@
<script setup lang="tsx">
import { useMonacoEditor } from '@/hooks/web/useMonacoEditor'
import { onMounted, computed, watch, ref } from 'vue'
import { ElSelect, ElOption, ElFormItem, ElForm } from 'element-plus'
import { languageOptions, themeOptions } from './config/config'
const props = withDefaults(
defineProps<{
width?: string | number
height?: string | number
languageSelector?: boolean
language?: string
themeSelector?: boolean
theme?: string
editorOption?: object
modelValue: string
}>(),
{
width: '100%',
height: '100%',
languageSelector: true,
language: 'javascript',
themeSelector: true,
theme: 'vs-dark',
editorOption: () => ({}),
modelValue: ''
}
)
const emits = defineEmits<{
(e: 'blur'): void
(e: 'update:modelValue', val: string): void
}>()
const monacoEditorStyle = computed(() => {
return {
width: typeof props.width === 'string' ? props.width : props.width + 'px',
height: typeof props.height === 'string' ? props.height : props.height + 'px'
}
})
const {
monacoEditorRef,
createEditor,
updateVal,
updateOptions,
getEditor,
changeLanguage,
changeTheme
} = useMonacoEditor(props.language)
onMounted(() => {
const monacoEditor = createEditor(props.editorOption)
updateMonacoVal(props.modelValue)
monacoEditor?.onDidChangeModelContent(() => {
emits('update:modelValue', monacoEditor!.getValue())
})
monacoEditor?.onDidBlurEditorText(() => {
emits('blur')
})
})
watch(
() => props.modelValue,
() => {
updateMonacoVal(props.modelValue)
}
)
const localLanguage = ref(props.language)
watch(localLanguage, (newLanguage) => {
changeLanguage(newLanguage)
})
const localTheme = ref(props.theme)
watch(localTheme, (newTheme) => {
changeTheme(newTheme)
})
function updateMonacoVal(val: string) {
if (val !== getEditor()?.getValue()) {
updateVal(val)
}
}
defineExpose({ updateOptions })
</script>
<template>
<ElForm :inline="true">
<ElFormItem v-if="languageSelector" label="language" class="w-30% mb-5px!">
<ElSelect
v-model="localLanguage"
placeholder="Please select language"
size="small"
filterable
>
<ElOption
v-for="item in languageOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</ElSelect>
</ElFormItem>
<ElFormItem v-if="themeSelector" label="theme" class="w-30% mb-5px!">
<ElSelect v-model="localTheme" placeholder="Please select language" size="small" filterable>
<ElOption
v-for="item in themeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</ElSelect>
</ElFormItem>
</ElForm>
<div ref="monacoEditorRef" :style="monacoEditorStyle"></div>
</template>

View File

@ -1,129 +0,0 @@
export const languageOptions = [
{ label: 'plaintext', value: 'plaintext' },
{ label: 'abap', value: 'abap' },
{ label: 'apex', value: 'apex' },
{ label: 'azcli', value: 'azcli' },
{ label: 'bat', value: 'bat' },
{ label: 'bicep', value: 'bicep' },
{ label: 'cameligo', value: 'cameligo' },
{ label: 'clojure', value: 'clojure' },
{ label: 'coffeescript', value: 'coffeescript' },
{ label: 'c', value: 'c' },
{ label: 'cpp', value: 'cpp' },
{ label: 'csharp', value: 'csharp' },
{ label: 'csp', value: 'csp' },
{ label: 'css', value: 'css' },
{ label: 'cypher', value: 'cypher' },
{ label: 'dart', value: 'dart' },
{ label: 'dockerfile', value: 'dockerfile' },
{ label: 'ecl', value: 'ecl' },
{ label: 'elixir', value: 'elixir' },
{ label: 'flow9', value: 'flow9' },
{ label: 'fsharp', value: 'fsharp' },
{ label: 'freemarker2', value: 'freemarker2' },
{
label: 'freemarker2.tag-angle.interpolation-dollar',
value: 'freemarker2.tag-angle.interpolation-dollar'
},
{
label: 'freemarker2.tag-bracket.interpolation-dollar',
value: 'freemarker2.tag-bracket.interpolation-dollar'
},
{
label: 'freemarker2.tag-angle.interpolation-bracket',
value: 'freemarker2.tag-angle.interpolation-bracket'
},
{
label: 'freemarker2.tag-bracket.interpolation-bracket',
value: 'freemarker2.tag-bracket.interpolation-bracket'
},
{
label: 'freemarker2.tag-auto.interpolation-dollar',
value: 'freemarker2.tag-auto.interpolation-dollar'
},
{
label: 'freemarker2.tag-auto.interpolation-bracket',
value: 'freemarker2.tag-auto.interpolation-bracket'
},
{ label: 'go', value: 'go' },
{ label: 'graphql', value: 'graphql' },
{ label: 'handlebars', value: 'handlebars' },
{ label: 'hcl', value: 'hcl' },
{ label: 'html', value: 'html' },
{ label: 'ini', value: 'ini' },
{ label: 'java', value: 'java' },
{ label: 'javascript', value: 'javascript' },
{ label: 'julia', value: 'julia' },
{ label: 'kotlin', value: 'kotlin' },
{ label: 'less', value: 'less' },
{ label: 'lexon', value: 'lexon' },
{ label: 'lua', value: 'lua' },
{ label: 'liquid', value: 'liquid' },
{ label: 'm3', value: 'm3' },
{ label: 'markdown', value: 'markdown' },
{ label: 'mdx', value: 'mdx' },
{ label: 'mips', value: 'mips' },
{ label: 'msdax', value: 'msdax' },
{ label: 'mysql', value: 'mysql' },
{ label: 'objective-c', value: 'objective-c' },
{ label: 'pascal', value: 'pascal' },
{ label: 'pascaligo', value: 'pascaligo' },
{ label: 'perl', value: 'perl' },
{ label: 'pgsql', value: 'pgsql' },
{ label: 'php', value: 'php' },
{ label: 'pla', value: 'pla' },
{ label: 'postiats', value: 'postiats' },
{ label: 'powerquery', value: 'powerquery' },
{ label: 'powershell', value: 'powershell' },
{ label: 'proto', value: 'proto' },
{ label: 'pug', value: 'pug' },
{ label: 'python', value: 'python' },
{ label: 'qsharp', value: 'qsharp' },
{ label: 'r', value: 'r' },
{ label: 'razor', value: 'razor' },
{ label: 'redis', value: 'redis' },
{ label: 'redshift', value: 'redshift' },
{ label: 'restructuredtext', value: 'restructuredtext' },
{ label: 'ruby', value: 'ruby' },
{ label: 'rust', value: 'rust' },
{ label: 'sb', value: 'sb' },
{ label: 'scala', value: 'scala' },
{ label: 'scheme', value: 'scheme' },
{ label: 'scss', value: 'scss' },
{ label: 'shell', value: 'shell' },
{ label: 'sol', value: 'sol' },
{ label: 'aes', value: 'aes' },
{ label: 'sparql', value: 'sparql' },
{ label: 'sql', value: 'sql' },
{ label: 'st', value: 'st' },
{ label: 'swift', value: 'swift' },
{ label: 'systemverilog', value: 'systemverilog' },
{ label: 'verilog', value: 'verilog' },
{ label: 'tcl', value: 'tcl' },
{ label: 'twig', value: 'twig' },
{ label: 'typescript', value: 'typescript' },
{ label: 'vb', value: 'vb' },
{ label: 'wgsl', value: 'wgsl' },
{ label: 'xml', value: 'xml' },
{ label: 'yaml', value: 'yaml' },
{ label: 'json', value: 'json' }
]
export const themeOptions = [
{
label: 'vs',
value: 'vs'
},
{
label: 'vs-dark',
value: 'vs-dark'
},
{
label: 'hc-black',
value: 'hc-black'
},
{
label: 'hc-light',
value: 'hc-light'
}
]

View File

@ -26,7 +26,7 @@ const toggleCollapse = () => {
<div :class="prefixCls" @click="toggleCollapse">
<Icon
:size="18"
:icon="collapse ? 'vi-ant-design:menu-unfold-outlined' : 'vi-ant-design:menu-fold-outlined'"
:icon="collapse ? 'ant-design:menu-unfold-outlined' : 'ant-design:menu-fold-outlined'"
:color="color"
class="cursor-pointer"
/>

View File

@ -22,11 +22,8 @@ defineProps({
<template #content>
<div class="max-w-200px">{{ message }}</div>
</template>
<Icon class="ml-5px" icon="vi-bi:question-circle-fill" :size="14" />
<Icon class="ml-5px" icon="bi:question-circle-fill" :size="14" />
</ElTooltip>
<div class="flex pl-20px flex-grow">
<slot name="header"></slot>
</div>
</div>
</template>
<div>

View File

@ -1,3 +0,0 @@
import CountTo from './src/CountTo.vue'
export { CountTo }

View File

@ -1,180 +0,0 @@
<script setup lang="ts">
import { reactive, computed, watch, onMounted, unref, toRef, PropType } from 'vue'
import { isNumber } from '@/utils/is'
import { propTypes } from '@/utils/propTypes'
import { useDesign } from '@/hooks/web/useDesign'
const { getPrefixCls } = useDesign()
const prefixCls = getPrefixCls('count-to')
const props = defineProps({
startVal: propTypes.number.def(0),
endVal: propTypes.number.def(2021),
duration: propTypes.number.def(3000),
autoplay: propTypes.bool.def(true),
decimals: propTypes.number.validate((value: number) => value >= 0).def(0),
decimal: propTypes.string.def('.'),
separator: propTypes.string.def(','),
prefix: propTypes.string.def(''),
suffix: propTypes.string.def(''),
useEasing: propTypes.bool.def(true),
easingFn: {
type: Function as PropType<(t: number, b: number, c: number, d: number) => number>,
default(t: number, b: number, c: number, d: number) {
return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b
}
}
})
const emit = defineEmits(['mounted', 'callback'])
const formatNumber = (num: number | string) => {
const { decimals, decimal, separator, suffix, prefix } = props
num = Number(num).toFixed(decimals)
num += ''
const x = num.split('.')
let x1 = x[0]
const x2 = x.length > 1 ? decimal + x[1] : ''
const rgx = /(\d+)(\d{3})/
if (separator && !isNumber(separator)) {
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + separator + '$2')
}
}
return prefix + x1 + x2 + suffix
}
const state = reactive<{
localStartVal: number
printVal: number | null
displayValue: string
paused: boolean
localDuration: number | null
startTime: number | null
timestamp: number | null
rAF: any
remaining: number | null
}>({
localStartVal: props.startVal,
displayValue: formatNumber(props.startVal),
printVal: null,
paused: false,
localDuration: props.duration,
startTime: null,
timestamp: null,
remaining: null,
rAF: null
})
const displayValue = toRef(state, 'displayValue')
onMounted(() => {
if (props.autoplay) {
start()
}
emit('mounted')
})
const getCountDown = computed(() => {
return props.startVal > props.endVal
})
watch([() => props.startVal, () => props.endVal], () => {
if (props.autoplay) {
start()
}
})
const start = () => {
const { startVal, duration } = props
state.localStartVal = startVal
state.startTime = null
state.localDuration = duration
state.paused = false
state.rAF = requestAnimationFrame(count)
}
const pauseResume = () => {
if (state.paused) {
resume()
state.paused = false
} else {
pause()
state.paused = true
}
}
const pause = () => {
cancelAnimationFrame(state.rAF)
}
const resume = () => {
state.startTime = null
state.localDuration = +(state.remaining as number)
state.localStartVal = +(state.printVal as number)
requestAnimationFrame(count)
}
const reset = () => {
state.startTime = null
cancelAnimationFrame(state.rAF)
state.displayValue = formatNumber(props.startVal)
}
const count = (timestamp: number) => {
const { useEasing, easingFn, endVal } = props
if (!state.startTime) state.startTime = timestamp
state.timestamp = timestamp
const progress = timestamp - state.startTime
state.remaining = (state.localDuration as number) - progress
if (useEasing) {
if (unref(getCountDown)) {
state.printVal =
state.localStartVal -
easingFn(progress, 0, state.localStartVal - endVal, state.localDuration as number)
} else {
state.printVal = easingFn(
progress,
state.localStartVal,
endVal - state.localStartVal,
state.localDuration as number
)
}
} else {
if (unref(getCountDown)) {
state.printVal =
state.localStartVal -
(state.localStartVal - endVal) * (progress / (state.localDuration as number))
} else {
state.printVal =
state.localStartVal +
(endVal - state.localStartVal) * (progress / (state.localDuration as number))
}
}
if (unref(getCountDown)) {
state.printVal = state.printVal < endVal ? endVal : state.printVal
} else {
state.printVal = state.printVal > endVal ? endVal : state.printVal
}
state.displayValue = formatNumber(state.printVal!)
if (progress < (state.localDuration as number)) {
state.rAF = requestAnimationFrame(count)
} else {
emit('callback')
}
}
defineExpose({
pauseResume,
reset,
start,
pause
})
</script>
<template>
<span :class="prefixCls">
{{ displayValue }}
</span>
</template>

View File

@ -1,5 +1,5 @@
<script lang="tsx">
import { ElCollapseTransition, ElTooltip, ElRow, ElCol } from 'element-plus'
import { ElCollapseTransition, ElDescriptions, ElDescriptionsItem, ElTooltip } from 'element-plus'
import { useDesign } from '@/hooks/web/useDesign'
import { propTypes } from '@/utils/propTypes'
import { ref, unref, PropType, computed, defineComponent } from 'vue'
@ -16,8 +16,6 @@ const { getPrefixCls } = useDesign()
const prefixCls = getPrefixCls('descriptions')
const defaultData = '-'
export default defineComponent({
name: 'Descriptions',
props: {
@ -38,7 +36,7 @@ export default defineComponent({
default: () => ({})
}
},
setup(props, { attrs }) {
setup(props, { slots, attrs }) {
const getBindValue = computed((): any => {
const delArr: string[] = ['title', 'message', 'collapse', 'schema', 'data', 'class']
const obj = { ...attrs, ...props }
@ -61,10 +59,7 @@ export default defineComponent({
delete obj[key]
}
}
return {
labelClassName: `${prefixCls}-label`,
...obj
}
return obj
}
//
@ -97,64 +92,37 @@ export default defineComponent({
{props.title}
{props.message ? (
<ElTooltip content={props.message} placement="right">
<Icon icon="vi-bi:question-circle-fill" class="ml-5px" size={14} />
<Icon icon="bi:question-circle-fill" class="ml-5px" size={14} />
</ElTooltip>
) : null}
</div>
</div>
{props.collapse ? (
<Icon icon={show.value ? 'vi-ep:arrow-down' : 'vi-ep:arrow-up'} />
) : null}
{props.collapse ? <Icon icon={show.value ? 'ep:arrow-down' : 'ep:arrow-up'} /> : null}
</div>
) : null}
<ElCollapseTransition>
<div v-show={unref(show)} class={[`${prefixCls}-content`, 'p-20px']}>
<ElRow
gutter={0}
{...unref(getBindValue)}
class="outline-1px outline-[var(--el-border-color-lighter)] outline-solid"
>
{props.schema.map((item) => {
return (
<ElCol
key={item.field}
span={item.span || 24 / props.column}
class="flex items-stretch"
>
{props.direction === 'horizontal' ? (
<div class="flex items-stretch bg-[var(--el-fill-color-light)] outline-1px outline-[var(--el-border-color-lighter)] outline-solid flex-1">
<div
{...getBindItemValue(item)}
class="w-120px text-left px-8px py-11px font-700 color-[var(--el-text-color-regular)] border-r-1px border-r-[var(--el-border-color-lighter)] border-r-solid "
>
{item.label}
</div>
<div class="flex-1 px-8px py-11px bg-[var(--el-bg-color)] color-[var(--el-text-color-primary)] text-size-14px">
{item.slots?.default
? item.slots?.default(props.data)
: (get(props.data, item.field) ?? defaultData)}
</div>
</div>
) : (
<div class="bg-[var(--el-fill-color-light)] outline-1px outline-[var(--el-border-color-lighter)] outline-solid flex-1">
<div
{...getBindItemValue(item)}
class="text-left px-8px py-11px font-700 color-[var(--el-text-color-regular)] border-b-1px border-b-[var(--el-border-color-lighter)] border-b-solid"
>
{item.label}
</div>
<div class="flex-1 px-8px py-11px bg-[var(--el-bg-color)] color-[var(--el-text-color-primary)] text-size-14px">
{item.slots?.default
? item.slots?.default(props.data)
: (get(props.data, item.field) ?? defaultData)}
</div>
</div>
)}
</ElCol>
)
})}
</ElRow>
<div v-show={unref(show)} class={[`${prefixCls}-content`]}>
<ElDescriptions {...unref(getBindValue)}>
{{
extra: () => (slots['extra'] ? slots['extra']() : props.extra),
default: () => {
return props.schema.map((item) => {
return (
<ElDescriptionsItem key={item.field} {...getBindItemValue(item)}>
{{
label: () => (item.slots?.label ? item.slots?.label(item) : item.label),
default: () =>
item.slots?.default
? item.slots?.default(props.data)
: get(props.data, item.field)
}}
</ElDescriptionsItem>
)
})
}
}}
</ElDescriptions>
</div>
</ElCollapseTransition>
</div>
@ -165,7 +133,7 @@ export default defineComponent({
</script>
<style lang="less" scoped>
@prefix-cls: ~'@{adminNamespace}-descriptions';
@prefix-cls: ~'@{namespace}-descriptions';
:deep(.@{elNamespace}-descriptions__header) {
display: none !important;
@ -185,13 +153,9 @@ export default defineComponent({
}
}
:deep(.@{prefix-cls}-label) {
width: 150px !important;
.@{prefix-cls}-content {
:deep(.@{elNamespace}-descriptions__cell) {
width: 0;
}
}
// .@{prefix-cls}-content {
// :deep(.@{elNamespace}-descriptions__cell) {
// width: 0;
// }
// }
</style>

View File

@ -1,178 +0,0 @@
import { ref } from 'vue'
export const useResize = (props?: {
minHeightPx?: number
minWidthPx?: number
initHeight?: number
initWidth?: number
}) => {
const {
minHeightPx = 400,
minWidthPx = window.innerWidth / 2,
initHeight = 400,
initWidth = window.innerWidth / 2
} = props || {}
// 屏幕宽度的 50% 作为最小宽度
// const minWidthPx = window.innerWidth / 2
// 固定的最小高度 400px
// const minHeightPx = 400
// 初始高度限制为 400px
const maxHeight = ref(initHeight + 'px')
// 初始宽度限制为 50%
const minWidth = ref(initWidth + 'px')
const setupDrag = (elDialog: any, el: any) => {
// 获取对话框元素
// 是否正在调整大小的标志
let isResizing = false
// 当前调整的方向
let currentResizeDirection = ''
// 鼠标移动时的事件处理器,用于检测鼠标位置并设置相应的光标样式
const handleMouseMove = (e: any) => {
const rect = elDialog.getBoundingClientRect()
// 鼠标相对于对话框左侧的偏移量
const offsetX = e.clientX - rect.left
// 鼠标相对于对话框顶部的偏移量
const offsetY = e.clientY - rect.top
const width = elDialog.clientWidth
const height = elDialog.clientHeight
// 获取对话框的内边距
const computedStyle = window.getComputedStyle(elDialog)
const paddingLeft = parseFloat(computedStyle.paddingLeft)
const paddingRight = parseFloat(computedStyle.paddingRight)
const paddingBottom = parseFloat(computedStyle.paddingBottom)
const paddingTop = parseFloat(computedStyle.paddingTop)
// 根据鼠标位置设置相应的光标样式和调整方向
if (!isResizing) {
if (offsetX < paddingLeft && offsetY > paddingTop && offsetY < height - paddingBottom) {
elDialog.style.cursor = 'ew-resize' // 左右箭头
currentResizeDirection = 'left'
} else if (
offsetX > width - paddingRight &&
offsetY > paddingTop &&
offsetY < height - paddingBottom
) {
elDialog.style.cursor = 'ew-resize' // 左右箭头
currentResizeDirection = 'right'
} else if (
offsetY < paddingTop &&
offsetX > paddingLeft &&
offsetX < width - paddingRight
) {
elDialog.style.cursor = 'ns-resize' // 上下箭头
currentResizeDirection = 'top'
} else if (
offsetY > height - paddingBottom &&
offsetX > paddingLeft &&
offsetX < width - paddingRight
) {
elDialog.style.cursor = 'ns-resize' // 上下箭头
currentResizeDirection = 'bottom'
} else if (offsetX < paddingLeft && offsetY < paddingTop) {
elDialog.style.cursor = 'nwse-resize' // 左上右下箭头
currentResizeDirection = 'top-left'
} else if (offsetX > width - paddingRight && offsetY < paddingTop) {
elDialog.style.cursor = 'nesw-resize' // 右上左下箭头
currentResizeDirection = 'top-right'
} else if (offsetX < paddingLeft && offsetY > height - paddingBottom) {
elDialog.style.cursor = 'nesw-resize' // 右上左下箭头
currentResizeDirection = 'bottom-left'
} else if (offsetX > width - paddingRight && offsetY > height - paddingBottom) {
elDialog.style.cursor = 'nwse-resize' // 左上右下箭头
currentResizeDirection = 'bottom-right'
} else {
elDialog.style.cursor = 'default'
currentResizeDirection = ''
}
}
}
// 鼠标按下时的事件处理器,开始调整对话框大小
const handleMouseDown = (e) => {
if (currentResizeDirection) {
isResizing = true
const initialX = e.clientX
const initialY = e.clientY
const initialWidth = elDialog.clientWidth
const initialHeight = el.querySelector('.el-dialog__body').clientHeight
// 调整大小的事件处理器
const handleResizing = (e: any) => {
if (!isResizing) return
let newWidth = initialWidth
let newHeight = initialHeight
// 根据当前调整方向计算新的宽度和高度
if (currentResizeDirection.includes('right')) {
newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2)
minWidth.value = `${newWidth}px`
}
if (currentResizeDirection.includes('left')) {
newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2)
minWidth.value = `${newWidth}px`
}
if (currentResizeDirection.includes('bottom')) {
newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20)
maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
}
if (currentResizeDirection.includes('top')) {
newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20)
maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
}
if (currentResizeDirection === 'top-left') {
newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2)
minWidth.value = `${newWidth}px`
newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20)
maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
}
if (currentResizeDirection === 'top-right') {
newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2)
minWidth.value = `${newWidth}px`
newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20)
maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
}
if (currentResizeDirection === 'bottom-left') {
newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2)
minWidth.value = `${newWidth}px`
newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20)
maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
}
if (currentResizeDirection === 'bottom-right') {
newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2)
minWidth.value = `${newWidth}px`
newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20)
maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
}
}
// 停止调整大小的事件处理器
const stopResizing = () => {
isResizing = false
document.removeEventListener('mousemove', handleResizing)
document.removeEventListener('mouseup', stopResizing)
}
document.addEventListener('mousemove', handleResizing)
document.addEventListener('mouseup', stopResizing)
}
}
elDialog.addEventListener('mousemove', handleMouseMove)
elDialog.addEventListener('mousedown', handleMouseDown)
}
return {
setupDrag,
maxHeight,
minWidth
}
}

View File

@ -49,13 +49,6 @@ watch(
}
)
watch(
() => props.maxHeight,
(val) => {
dialogHeight.value = isNumber(val) ? `${val}px` : val
}
)
const dialogStyle = computed(() => {
return {
height: unref(dialogHeight)
@ -85,16 +78,14 @@ const dialogStyle = computed(() => {
<Icon
v-if="fullscreen"
class="cursor-pointer is-hover !h-54px mr-10px"
:icon="
isFullscreen ? 'vi-radix-icons:exit-full-screen' : 'vi-radix-icons:enter-full-screen'
"
:icon="isFullscreen ? 'radix-icons:exit-full-screen' : 'radix-icons:enter-full-screen'"
color="var(--el-color-info)"
hover-color="var(--el-color-primary)"
@click="toggleFull"
/>
<Icon
class="cursor-pointer is-hover !h-54px"
icon="vi-ep:close"
icon="ep:close"
hover-color="var(--el-color-primary)"
color="var(--el-color-info)"
@click="close"
@ -122,22 +113,18 @@ const dialogStyle = computed(() => {
.@{elNamespace}-dialog {
margin: 0 !important;
&__header {
height: 54px;
padding: 0;
margin-right: 0 !important;
border-bottom: 1px solid var(--el-border-color);
padding: 0;
height: 54px;
}
&__body {
padding: 15px !important;
}
&__footer {
border-top: 1px solid var(--el-border-color);
}
&__headerbtn {
top: 0;
}

View File

@ -1,73 +0,0 @@
<script lang="tsx" setup>
import { propTypes } from '@/utils/propTypes'
import { computed, getCurrentInstance, onMounted, unref, useAttrs, useSlots } from 'vue'
import Dialog from './Dialog.vue'
import { useResize } from '../hooks/useResize'
const props = defineProps({
modelValue: propTypes.bool.def(false),
title: propTypes.string.def('Dialog'),
fullscreen: propTypes.bool.def(true),
initWidth: propTypes.number.def(window.innerWidth / 2),
initHeight: propTypes.number.def(200),
minResizeWidth: propTypes.number.def(window.innerWidth / 2),
minResizeHeight: propTypes.number.def(200)
})
const { maxHeight, minWidth, setupDrag } = useResize({
minHeightPx: props.minResizeHeight,
minWidthPx: props.minResizeWidth,
initHeight: props.initHeight,
initWidth: props.initWidth
})
const vResize = {
mounted(el) {
const observer = new MutationObserver(() => {
const elDialog = el.querySelector('.el-dialog')
if (elDialog) {
// `elDialog`
setupDrag(elDialog, el)
// observer.disconnect() //
}
})
//
observer.observe(el, { childList: true, subtree: true })
}
}
const attrs = useAttrs()
const slots = useSlots()
const getBindValue = computed(() => {
const delArr: string[] = ['maxHeight', 'width']
const obj = Object.assign({}, { ...unref(attrs), ...props })
for (const key in obj) {
if (delArr.indexOf(key) !== -1) {
delete obj[key]
}
}
return obj
})
const instance = getCurrentInstance()
const initDirective = () => {
const directives = instance?.appContext?.app._context?.directives
//
if (!directives || !directives['resize']) {
instance?.appContext?.app.directive('resize', vResize)
}
}
onMounted(() => {
initDirective()
})
</script>
<template>
<div v-resize>
<Dialog v-bind="getBindValue" :maxHeight="maxHeight" :width="minWidth">
<slot></slot>
<template v-if="slots.footer" #footer>
<slot name="footer"></slot>
</template>
</Dialog>
</div>
</template>

View File

@ -1,3 +0,0 @@
import Echart from './src/Echart.vue'
export { Echart }

View File

@ -1,115 +0,0 @@
<script setup lang="ts">
import type { EChartsOption } from 'echarts'
import echarts from '@/plugins/echarts'
import { debounce } from 'lodash-es'
import 'echarts-wordcloud'
import { propTypes } from '@/utils/propTypes'
import { computed, PropType, ref, unref, watch, onMounted, onBeforeUnmount, onActivated } from 'vue'
import { useAppStore } from '@/store/modules/app'
import { isString } from '@/utils/is'
import { useDesign } from '@/hooks/web/useDesign'
const { getPrefixCls, variables } = useDesign()
const prefixCls = getPrefixCls('echart')
const appStore = useAppStore()
const props = defineProps({
options: {
type: Object as PropType<EChartsOption>,
required: true
},
width: propTypes.oneOfType([Number, String]).def('100%'),
height: propTypes.oneOfType([Number, String]).def('500px')
})
const isDark = computed(() => appStore.getIsDark)
const theme = computed(() => {
const echartTheme: boolean | string = unref(isDark) ? true : 'auto'
return echartTheme
})
const options = computed(() => {
return Object.assign(props.options, {
darkMode: unref(theme)
})
})
const elRef = ref<ElRef>()
let echartRef: Nullable<echarts.ECharts> = null
const contentEl = ref<Element>()
const styles = computed(() => {
const width = isString(props.width) ? props.width : `${props.width}px`
const height = isString(props.height) ? props.height : `${props.height}px`
return {
width,
height
}
})
const initChart = () => {
if (unref(elRef) && props.options) {
echartRef = echarts.init(unref(elRef) as HTMLElement)
echartRef?.setOption(unref(options))
}
}
watch(
() => options.value,
(options) => {
if (echartRef) {
echartRef?.setOption(options)
}
},
{
deep: true
}
)
const resizeHandler = debounce(() => {
if (echartRef) {
echartRef.resize()
}
}, 100)
const contentResizeHandler = async (e: TransitionEvent) => {
if (e.propertyName === 'width') {
resizeHandler()
}
}
onMounted(() => {
setTimeout(() => {
initChart()
}, 0)
window.addEventListener('resize', resizeHandler)
contentEl.value = document.getElementsByClassName(`${variables.namespace}-layout-content`)[0]
unref(contentEl) &&
(unref(contentEl) as Element).addEventListener('transitionend', contentResizeHandler)
})
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeHandler)
unref(contentEl) &&
(unref(contentEl) as Element).removeEventListener('transitionend', contentResizeHandler)
})
onActivated(() => {
if (echartRef) {
echartRef.resize()
}
})
</script>
<template>
<div ref="elRef" :class="[$attrs.class, prefixCls]" :style="styles"></div>
</template>

View File

@ -35,6 +35,9 @@ watch(
(val: string) => {
if (val === unref(valueHtml)) return
valueHtml.value = val
},
{
immediate: true
}
)
@ -48,7 +51,6 @@ watch(
const handleCreated = (editor: IDomEditor) => {
editorRef.value = editor
valueHtml.value = props.modelValue
}
//

View File

@ -4,6 +4,7 @@ import networkError from '@/assets/svgs/500.svg'
import noPermission from '@/assets/svgs/403.svg'
import { propTypes } from '@/utils/propTypes'
import { useI18n } from '@/hooks/web/useI18n'
import { ElButton } from 'element-plus'
interface ErrorMap {
url: string
@ -50,7 +51,7 @@ const btnClick = () => {
<img width="350" :src="errorMap[type].url" alt="" />
<div class="text-14px text-[var(--el-color-info)]">{{ errorMap[type].message }}</div>
<div class="mt-20px">
<BaseButton type="primary" @click="btnClick">{{ errorMap[type].buttonText }}</BaseButton>
<ElButton type="primary" @click="btnClick">{{ errorMap[type].buttonText }}</ElButton>
</div>
</div>
</div>

View File

@ -15,7 +15,7 @@ const title = computed(() => appStore.getTitle)
<template>
<div
:class="prefixCls"
class="text-center text-[var(--el-text-color-placeholder)] bg-[var(--app-content-bg-color)] h-[var(--app-footer-height)] leading-[var(--app-footer-height)] dark:bg-[var(--el-bg-color)] overflow-hidden"
class="shrink-0 text-center text-[var(--el-text-color-placeholder)] bg-[var(--app-content-bg-color)] h-[var(--app-footer-height)] leading-[var(--app-footer-height)] dark:bg-[var(--el-bg-color)]"
>
Copyright ©2021-present {{ title }}
</div>

View File

@ -158,8 +158,7 @@ export default defineComponent({
{
field: item.field,
path:
item.component === ComponentNameEnum.TREE_SELECT ||
item.component === ComponentNameEnum.TRANSFER
item.component === ComponentNameEnum.TREE_SELECT
? 'componentProps.data'
: 'componentProps.options',
value: options
@ -231,7 +230,7 @@ export default defineComponent({
const { schema = [], isCol } = unref(getProps)
return schema
.filter((v) => !v.remove)
.filter((v) => !v.remove && !v.hidden)
.map((item) => {
// Divider
const isDivider = item.component === 'Divider'
@ -249,11 +248,8 @@ export default defineComponent({
// formItem
const renderFormItem = (item: FormSchema) => {
// optionApi使optionApi, options
if (
item.optionApi &&
(!item.componentProps?.options || !item.componentProps?.options.length)
) {
// optionApi使optionApi
if (item.optionApi) {
//
getOptions(item.optionApi, item)
}
@ -327,21 +323,7 @@ export default defineComponent({
}
})
return item.component === ComponentNameEnum.UPLOAD ? (
<Com
vModel:file-list={itemVal.value}
ref={(el: any) => setComponentRefMap(el, item.field)}
{...(autoSetPlaceholder && setTextPlaceholder(item))}
{...setComponentProps(item)}
style={
item.componentProps?.style || {
width: '100%'
}
}
>
{{ ...slotsMap }}
</Com>
) : (
return (
<Com
vModel={itemVal.value}
ref={(el: any) => setComponentRefMap(el, item.field)}
@ -404,10 +386,6 @@ export default defineComponent({
{...getFormBindValue()}
model={unref(getProps).isCustom ? unref(getProps).model : formModel}
class={prefixCls}
// @ts-ignore
onSubmit={(e: Event) => {
e.preventDefault()
}}
>
{{
//
@ -423,7 +401,7 @@ export default defineComponent({
</script>
<style lang="less" scoped>
.@{elNamespace}-form.@{adminNamespace}-form .@{elNamespace}-row {
.@{elNamespace}-form.@{namespace}-form .@{elNamespace}-row {
margin-right: 0 !important;
margin-left: 0 !important;
}

View File

@ -13,14 +13,15 @@ export const useRenderCheckbox = () => {
item.component === ComponentNameEnum.CHECKBOX_GROUP ? ElCheckbox : ElCheckboxButton
) as ReturnType<typeof defineComponent>
return componentProps?.options?.map((option) => {
const { ...other } = option
const { value, ...other } = option
return (
<Com
{...other}
disabled={option[disabledAlias || 'disabled']}
label={option[labelAlias || 'label']}
value={option[valueAlias || 'value']}
></Com>
label={option[valueAlias || 'value']}
>
{option[labelAlias || 'label']}
</Com>
)
})
}

View File

@ -13,14 +13,15 @@ export const useRenderRadio = () => {
item.component === ComponentNameEnum.RADIO_GROUP ? ElRadio : ElRadioButton
) as ReturnType<typeof defineComponent>
return componentProps?.options?.map((option) => {
const { ...other } = option
const { value, ...other } = option
return (
<Com
{...other}
disabled={option[disabledAlias || 'disabled']}
label={option[labelAlias || 'label']}
value={option[valueAlias || 'value']}
></Com>
label={option[valueAlias || 'value']}
>
{option[labelAlias || 'label']}
</Com>
)
})
}

View File

@ -22,9 +22,6 @@ import {
} from 'element-plus'
import { InputPassword } from '@/components/InputPassword'
import { Editor } from '@/components/Editor'
import { JsonEditor } from '@/components/JsonEditor'
import { IconPicker } from '@/components/IconPicker'
import { IAgree } from '@/components/IAgree'
import { ComponentName } from '../types'
const componentMap: Recordable<Component, ComponentName> = {
@ -50,10 +47,7 @@ const componentMap: Recordable<Component, ComponentName> = {
InputPassword: InputPassword,
Editor: Editor,
TreeSelect: ElTreeSelect,
Upload: ElUpload,
JsonEditor: JsonEditor,
IconPicker: IconPicker,
IAgree: IAgree
Upload: ElUpload
}
export { componentMap }

View File

@ -158,12 +158,5 @@ export const initModel = (schema: FormSchema[], formModel: Recordable) => {
// model[v.field] = hasField ? model[v.field] : v.value !== void 0 ? v.value : undefined
}
})
// 如果 schema 对应的 field 不存在,则删除 model 中的对应的 field
for (let i = 0; i < schema.length; i++) {
const key = schema[i].field
if (!Object.prototype.hasOwnProperty.call(model, key)) {
delete model[key]
}
}
return model
}

View File

@ -21,8 +21,6 @@ import {
UploadProps
} from 'element-plus'
import { IEditorConfig } from '@wangeditor/editor'
import { JsonEditorProps } from '@/components/JsonEditor'
import { IAgreeProps } from '@/components/IAgree'
import { CSSProperties } from 'vue'
export interface PlaceholderModel {
@ -55,10 +53,7 @@ export enum ComponentNameEnum {
INPUT_PASSWORD = 'InputPassword',
EDITOR = 'Editor',
TREE_SELECT = 'TreeSelect',
UPLOAD = 'Upload',
JSON_EDITOR = 'JsonEditor',
ICON_PICKER = 'IconPicker',
I_AGREE = 'IAgree'
UPLOAD = 'Upload'
}
type CamelCaseComponentName = keyof typeof ComponentNameEnum extends infer K
@ -138,7 +133,7 @@ export interface SelectComponentProps extends Omit<Partial<ISelectProps>, 'optio
children?: string
}
on?: {
change?: (value: string | number | boolean | object) => void
change?: (value: string | number | boolean | Object) => void
visibleChange?: (visible: boolean) => void
removeTag?: (tag: any) => void
clear?: () => void
@ -186,7 +181,7 @@ export interface SelectV2ComponentProps {
placement?: AutocompleteProps['placement']
collapseTagsTooltip?: boolean
on?: {
change?: (value: string | number | boolean | object) => void
change?: (value: string | number | boolean | Object) => void
visibleChange?: (visible: boolean) => void
removeTag?: (tag: any) => void
clear?: () => void
@ -556,7 +551,7 @@ export interface TreeSelectComponentProps
allowDrag?: (...args: any[]) => boolean
allowDrop?: (...args: any[]) => boolean
on?: {
change?: (value: string | number | boolean | object) => void
change?: (value: string | number | boolean | Object) => void
visibleChange?: (visible: boolean) => void
removeTag?: (tag: any) => void
clear?: () => void
@ -625,8 +620,6 @@ export interface FormSchema {
| InputPasswordComponentProps
| TreeSelectComponentProps
| UploadComponentProps
| JsonEditorProps
| IAgreeProps
| any
/**

View File

@ -1,3 +0,0 @@
import Highlight from './src/Highlight.vue'
export { Highlight }

View File

@ -1,65 +0,0 @@
<script lang="tsx">
import { defineComponent, PropType, computed, h, unref } from 'vue'
import { propTypes } from '@/utils/propTypes'
export default defineComponent({
name: 'Highlight',
props: {
tag: propTypes.string.def('span'),
keys: {
type: Array as PropType<string[]>,
default: () => []
},
color: propTypes.string.def('var(--el-color-primary)')
},
emits: ['click'],
setup(props, { emit, slots }) {
const keyNodes = computed(() => {
return props.keys.map((key) => {
return h(
'span',
{
onClick: () => {
emit('click', key)
},
style: {
color: props.color,
cursor: 'pointer'
}
},
key
)
})
})
const parseText = (text: string) => {
props.keys.forEach((key, index) => {
const regexp = new RegExp(key, 'g')
text = text.replace(regexp, `{{${index}}}`)
})
return text.split(/{{|}}/)
}
const renderText = () => {
if (!slots?.default) return null
const node = slots?.default()[0].children
if (!node) {
return slots?.default()[0]
}
const textArray = parseText(node as string)
const regexp = /^[0-9]*$/
const nodes = textArray.map((t) => {
if (regexp.test(t)) {
return unref(keyNodes)[t] || t
}
return t
})
return h(props.tag, nodes)
}
return () => renderText()
}
})
</script>

View File

@ -1,4 +0,0 @@
import IAgree from './src/IAgree.vue'
export type { LinkItem, IAgreeProps } from './src/types'
export { IAgree }

View File

@ -1,41 +0,0 @@
<script lang="ts" setup>
import { ElCheckbox } from 'element-plus'
import { Highlight } from '@/components/Highlight'
import { PropType, computed } from 'vue'
import { LinkItem } from './types'
const props = defineProps({
text: {
type: String,
default: ''
},
link: {
type: Array as PropType<LinkItem[]>,
default: undefined
}
})
const modelValue = defineModel<boolean>()
const highlightKeys = computed(() => {
return props.link?.map((item) => item.text) || []
})
const keyClick = (key: string) => {
const linkItem = props.link?.find((item) => item.text === key)
if (linkItem?.url) {
window.open(linkItem.url)
return
}
if (linkItem?.onClick) {
linkItem.onClick()
}
}
</script>
<template>
<div class="flex items-center">
<ElCheckbox v-model="modelValue" class="mr-0px!" />
<Highlight class="ml-10px" :keys="highlightKeys" @click="keyClick">{{ text }}</Highlight>
</div>
</template>

View File

@ -1,10 +0,0 @@
export interface LinkItem {
text: string
url?: string
onClick?: () => void
}
export interface IAgreeProps {
text: string
link: LinkItem[]
}

View File

@ -4,7 +4,6 @@ import { ElIcon } from 'element-plus'
import { propTypes } from '@/utils/propTypes'
import { useDesign } from '@/hooks/web/useDesign'
import { Icon } from '@iconify/vue'
import { ICON_PREFIX } from '@/constants'
const { getPrefixCls } = useDesign()
@ -38,10 +37,6 @@ const getIconifyStyle = computed(() => {
color
}
})
const getIconName = computed(() => {
return props.icon.startsWith(ICON_PREFIX) ? props.icon.replace(ICON_PREFIX, '') : props.icon
})
</script>
<template>
@ -51,14 +46,14 @@ const getIconName = computed(() => {
</svg>
<template v-else>
<Icon v-if="isUseOnline" :icon="getIconName" :style="getIconifyStyle" />
<Icon v-if="isUseOnline" :icon="icon" :style="getIconifyStyle" />
<div v-else :class="`${icon} iconify`" :style="getIconifyStyle"></div>
</template>
</ElIcon>
</template>
<style lang="less" scoped>
@prefix-cls: ~'@{adminNamespace}-icon';
@prefix-cls: ~'@{namespace}-icon';
.@{prefix-cls},
.iconify {

View File

@ -1,3 +0,0 @@
import IconPicker from './src/IconPicker.vue'
export { IconPicker }

View File

@ -1,193 +0,0 @@
<script setup lang="ts">
import epIcons from './data/icons.ep'
import antIcons from './data/icons.ant-design'
import tIcons from './data/icons.tdesign'
import { useDesign } from '@/hooks/web/useDesign'
import { ElInput, ElPopover, ElScrollbar, ElTabs, ElTabPane, ElPagination } from 'element-plus'
import { useAppStore } from '@/store/modules/app'
import { computed, CSSProperties, ref, unref, watch } from 'vue'
import { nextTick } from 'vue'
const init = async (icon?: string) => {
if (!icon) return
const iconInfo = icon.split(':')
iconName.value = iconInfo[0]
const wrapIndex = icons.findIndex((item) => item.prefix === iconInfo[0])
// icon
const index = filterItemIcons(icons[wrapIndex].icons).findIndex((item) => item === icon)
// icon
await nextTick()
currentPage.value = Math.ceil((index + 1) / unref(pageSize))
}
const modelValue = defineModel<string>()
const appStore = useAppStore()
const size = computed(() => appStore.getCurrentSize)
const iconSize = computed(() => {
return unref(size) === 'small'
? 'var(--el-component-size-small)'
: unref(size) === 'large'
? 'var(--el-component-size-large)'
: 'var(--el-component-size)'
})
const iconWrapStyle = computed((): CSSProperties => {
return {
width: unref(iconSize),
height: unref(iconSize),
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
boxShadow: '0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset',
position: 'relative',
left: '-1px',
cursor: 'pointer'
}
})
const { getPrefixCls } = useDesign()
const prefixCls = getPrefixCls('icon-picker')
const icons = [epIcons, antIcons, tIcons]
const iconName = ref(icons[0].prefix)
const currentIconNameIndex = computed(() => {
return icons.findIndex((item) => item.prefix === unref(iconName))
})
const tabChange = () => {
currentPage.value = 1
}
const pageSize = ref(49)
const currentPage = ref(1)
const filterIcons = (icons: string[]) => {
const start = (unref(currentPage) - 1) * unref(pageSize)
const end = unref(currentPage) * unref(pageSize)
return icons.slice(start, end)
}
watch(
() => modelValue.value,
async (val) => {
await nextTick()
val && init(val)
},
{
immediate: true
}
)
const popoverShow = () => {
init(unref(modelValue))
}
const iconSelect = (icon: string) => {
// icon
if (icon === unref(modelValue)) {
modelValue.value = ''
return
}
modelValue.value = icon
}
const search = ref('')
const filterItemIcons = (icons: string[]) => {
return icons.filter((item) => item.includes(unref(search)))
}
const inputClear = () => {
init(unref(modelValue))
}
</script>
<template>
<div :class="prefixCls" class="flex justify-center items-center box">
<ElInput disabled v-model="modelValue" clearable />
<ElPopover
placement="bottom"
trigger="click"
:width="450"
popper-style="box-shadow: rgb(14 18 22 / 35%) 0px 10px 38px -10px, rgb(14 18 22 / 20%) 0px 10px 20px -15px; height: 380px;"
@show="popoverShow"
>
<template #reference>
<div :style="iconWrapStyle">
<Icon v-if="modelValue" :icon="modelValue" />
</div>
</template>
<ElScrollbar class="h-[calc(100%-50px)]!">
<ElInput
v-model="search"
class="mb-20px"
clearable
placeholder="搜索图标"
@clear="inputClear"
/>
<ElTabs tab-position="left" v-model="iconName" @tab-change="tabChange">
<ElTabPane v-for="item in icons" :key="item.name" :label="item.name" :name="item.prefix">
<div class="flex flex-wrap box-border">
<div
v-for="icon in filterIcons(filterItemIcons(item.icons))"
:key="icon"
:style="{
width: iconSize,
height: iconSize,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
cursor: 'pointer',
border: `1px solid ${
icon === modelValue ? 'var(--el-color-primary)' : 'var(--el-border-color)'
}`,
boxSizing: 'border-box',
margin: '2px',
transition: 'all 0.3s'
}"
class="hover:border-color-[var(--el-color-primary)]!"
@click="iconSelect(icon)"
>
<Icon
:icon="icon"
:color="icon === modelValue ? 'var(--el-color-primary)' : 'inherit'"
/>
</div>
</div>
</ElTabPane>
</ElTabs>
</ElScrollbar>
<div
class="h-50px absolute bottom-0 left-0 flex items-center pl-[var(--el-popover-padding)] pr-[var(--el-popover-padding)]"
>
<ElPagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:pager-count="5"
small
:page-sizes="[100, 200, 300, 400]"
layout="total, prev, pager, next, jumper"
:total="filterItemIcons(icons[currentIconNameIndex].icons).length"
/>
</div>
</ElPopover>
</div>
</template>
<style lang="less" scoped>
@prefix-cls: ~'@{adminNamespace}-icon-picker';
.@{prefix-cls} {
:deep(.@{elNamespace}-input__wrapper) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
}
</style>

View File

@ -1,836 +0,0 @@
export default {
name: 'Ant Design Icons',
prefix: 'vi-ant-design',
icons: [
'vi-ant-design:account-book-filled',
'vi-ant-design:account-book-outlined',
'vi-ant-design:account-book-twotone',
'vi-ant-design:aim-outlined',
'vi-ant-design:alert-filled',
'vi-ant-design:alert-outlined',
'vi-ant-design:alert-twotone',
'vi-ant-design:alibaba-outlined',
'vi-ant-design:align-center-outlined',
'vi-ant-design:align-left-outlined',
'vi-ant-design:align-right-outlined',
'vi-ant-design:alipay-circle-filled',
'vi-ant-design:alipay-circle-outlined',
'vi-ant-design:alipay-outlined',
'vi-ant-design:alipay-square-filled',
'vi-ant-design:aliwangwang-filled',
'vi-ant-design:aliwangwang-outlined',
'vi-ant-design:aliyun-outlined',
'vi-ant-design:amazon-circle-filled',
'vi-ant-design:amazon-outlined',
'vi-ant-design:amazon-square-filled',
'vi-ant-design:android-filled',
'vi-ant-design:android-outlined',
'vi-ant-design:ant-cloud-outlined',
'vi-ant-design:ant-design-outlined',
'vi-ant-design:apartment-outlined',
'vi-ant-design:api-filled',
'vi-ant-design:api-outlined',
'vi-ant-design:api-twotone',
'vi-ant-design:apple-filled',
'vi-ant-design:apple-outlined',
'vi-ant-design:appstore-add-outlined',
'vi-ant-design:appstore-filled',
'vi-ant-design:appstore-outlined',
'vi-ant-design:appstore-twotone',
'vi-ant-design:area-chart-outlined',
'vi-ant-design:arrow-down-outlined',
'vi-ant-design:arrow-left-outlined',
'vi-ant-design:arrow-right-outlined',
'vi-ant-design:arrow-up-outlined',
'vi-ant-design:arrows-alt-outlined',
'vi-ant-design:audio-filled',
'vi-ant-design:audio-muted-outlined',
'vi-ant-design:audio-outlined',
'vi-ant-design:audio-twotone',
'vi-ant-design:audit-outlined',
'vi-ant-design:backward-filled',
'vi-ant-design:backward-outlined',
'vi-ant-design:baidu-outlined',
'vi-ant-design:bank-filled',
'vi-ant-design:bank-outlined',
'vi-ant-design:bank-twotone',
'vi-ant-design:bar-chart-outlined',
'vi-ant-design:barcode-outlined',
'vi-ant-design:bars-outlined',
'vi-ant-design:behance-circle-filled',
'vi-ant-design:behance-outlined',
'vi-ant-design:behance-square-filled',
'vi-ant-design:behance-square-outlined',
'vi-ant-design:bell-filled',
'vi-ant-design:bell-outlined',
'vi-ant-design:bell-twotone',
'vi-ant-design:bg-colors-outlined',
'vi-ant-design:bilibili-filled',
'vi-ant-design:bilibili-outlined',
'vi-ant-design:block-outlined',
'vi-ant-design:bold-outlined',
'vi-ant-design:book-filled',
'vi-ant-design:book-outlined',
'vi-ant-design:book-twotone',
'vi-ant-design:border-bottom-outlined',
'vi-ant-design:border-horizontal-outlined',
'vi-ant-design:border-inner-outlined',
'vi-ant-design:border-left-outlined',
'vi-ant-design:border-outer-outlined',
'vi-ant-design:border-outlined',
'vi-ant-design:border-right-outlined',
'vi-ant-design:border-top-outlined',
'vi-ant-design:border-verticle-outlined',
'vi-ant-design:borderless-table-outlined',
'vi-ant-design:box-plot-filled',
'vi-ant-design:box-plot-outlined',
'vi-ant-design:box-plot-twotone',
'vi-ant-design:branches-outlined',
'vi-ant-design:bug-filled',
'vi-ant-design:bug-outlined',
'vi-ant-design:bug-twotone',
'vi-ant-design:build-filled',
'vi-ant-design:build-outlined',
'vi-ant-design:build-twotone',
'vi-ant-design:bulb-filled',
'vi-ant-design:bulb-outlined',
'vi-ant-design:bulb-twotone',
'vi-ant-design:calculator-filled',
'vi-ant-design:calculator-outlined',
'vi-ant-design:calculator-twotone',
'vi-ant-design:calendar-filled',
'vi-ant-design:calendar-outlined',
'vi-ant-design:calendar-twotone',
'vi-ant-design:camera-filled',
'vi-ant-design:camera-outlined',
'vi-ant-design:camera-twotone',
'vi-ant-design:car-filled',
'vi-ant-design:car-outlined',
'vi-ant-design:car-twotone',
'vi-ant-design:caret-down-filled',
'vi-ant-design:caret-down-outlined',
'vi-ant-design:caret-left-filled',
'vi-ant-design:caret-left-outlined',
'vi-ant-design:caret-right-filled',
'vi-ant-design:caret-right-outlined',
'vi-ant-design:caret-up-filled',
'vi-ant-design:caret-up-outlined',
'vi-ant-design:carry-out-filled',
'vi-ant-design:carry-out-outlined',
'vi-ant-design:carry-out-twotone',
'vi-ant-design:check-circle-filled',
'vi-ant-design:check-circle-outlined',
'vi-ant-design:check-circle-twotone',
'vi-ant-design:check-outlined',
'vi-ant-design:check-square-filled',
'vi-ant-design:check-square-outlined',
'vi-ant-design:check-square-twotone',
'vi-ant-design:chrome-filled',
'vi-ant-design:chrome-outlined',
'vi-ant-design:ci-circle-filled',
'vi-ant-design:ci-circle-outlined',
'vi-ant-design:ci-circle-twotone',
'vi-ant-design:ci-outlined',
'vi-ant-design:ci-twotone',
'vi-ant-design:clear-outlined',
'vi-ant-design:clock-circle-filled',
'vi-ant-design:clock-circle-outlined',
'vi-ant-design:clock-circle-twotone',
'vi-ant-design:close-circle-filled',
'vi-ant-design:close-circle-outlined',
'vi-ant-design:close-circle-twotone',
'vi-ant-design:close-outlined',
'vi-ant-design:close-square-filled',
'vi-ant-design:close-square-outlined',
'vi-ant-design:close-square-twotone',
'vi-ant-design:cloud-download-outlined',
'vi-ant-design:cloud-filled',
'vi-ant-design:cloud-outlined',
'vi-ant-design:cloud-server-outlined',
'vi-ant-design:cloud-sync-outlined',
'vi-ant-design:cloud-twotone',
'vi-ant-design:cloud-upload-outlined',
'vi-ant-design:cluster-outlined',
'vi-ant-design:code-filled',
'vi-ant-design:code-outlined',
'vi-ant-design:code-sandbox-circle-filled',
'vi-ant-design:code-sandbox-outlined',
'vi-ant-design:code-sandbox-square-filled',
'vi-ant-design:code-twotone',
'vi-ant-design:codepen-circle-filled',
'vi-ant-design:codepen-circle-outlined',
'vi-ant-design:codepen-outlined',
'vi-ant-design:codepen-square-filled',
'vi-ant-design:coffee-outlined',
'vi-ant-design:column-height-outlined',
'vi-ant-design:column-width-outlined',
'vi-ant-design:comment-outlined',
'vi-ant-design:compass-filled',
'vi-ant-design:compass-outlined',
'vi-ant-design:compass-twotone',
'vi-ant-design:compress-outlined',
'vi-ant-design:console-sql-outlined',
'vi-ant-design:contacts-filled',
'vi-ant-design:contacts-outlined',
'vi-ant-design:contacts-twotone',
'vi-ant-design:container-filled',
'vi-ant-design:container-outlined',
'vi-ant-design:container-twotone',
'vi-ant-design:control-filled',
'vi-ant-design:control-outlined',
'vi-ant-design:control-twotone',
'vi-ant-design:copy-filled',
'vi-ant-design:copy-outlined',
'vi-ant-design:copy-twotone',
'vi-ant-design:copyright-circle-filled',
'vi-ant-design:copyright-circle-outlined',
'vi-ant-design:copyright-circle-twotone',
'vi-ant-design:copyright-outlined',
'vi-ant-design:copyright-twotone',
'vi-ant-design:credit-card-filled',
'vi-ant-design:credit-card-outlined',
'vi-ant-design:credit-card-twotone',
'vi-ant-design:crown-filled',
'vi-ant-design:crown-outlined',
'vi-ant-design:crown-twotone',
'vi-ant-design:customer-service-filled',
'vi-ant-design:customer-service-outlined',
'vi-ant-design:customer-service-twotone',
'vi-ant-design:dash-outlined',
'vi-ant-design:dashboard-filled',
'vi-ant-design:dashboard-outlined',
'vi-ant-design:dashboard-twotone',
'vi-ant-design:database-filled',
'vi-ant-design:database-outlined',
'vi-ant-design:database-twotone',
'vi-ant-design:delete-column-outlined',
'vi-ant-design:delete-filled',
'vi-ant-design:delete-outlined',
'vi-ant-design:delete-row-outlined',
'vi-ant-design:delete-twotone',
'vi-ant-design:delivered-procedure-outlined',
'vi-ant-design:deployment-unit-outlined',
'vi-ant-design:desktop-outlined',
'vi-ant-design:diff-filled',
'vi-ant-design:diff-outlined',
'vi-ant-design:diff-twotone',
'vi-ant-design:dingding-outlined',
'vi-ant-design:dingtalk-circle-filled',
'vi-ant-design:dingtalk-outlined',
'vi-ant-design:dingtalk-square-filled',
'vi-ant-design:disconnect-outlined',
'vi-ant-design:discord-filled',
'vi-ant-design:discord-outlined',
'vi-ant-design:dislike-filled',
'vi-ant-design:dislike-outlined',
'vi-ant-design:dislike-twotone',
'vi-ant-design:docker-outlined',
'vi-ant-design:dollar-circle-filled',
'vi-ant-design:dollar-circle-outlined',
'vi-ant-design:dollar-circle-twotone',
'vi-ant-design:dollar-outlined',
'vi-ant-design:dollar-twotone',
'vi-ant-design:dot-chart-outlined',
'vi-ant-design:dot-net-outlined',
'vi-ant-design:double-left-outlined',
'vi-ant-design:double-right-outlined',
'vi-ant-design:down-circle-filled',
'vi-ant-design:down-circle-outlined',
'vi-ant-design:down-circle-twotone',
'vi-ant-design:down-outlined',
'vi-ant-design:down-square-filled',
'vi-ant-design:down-square-outlined',
'vi-ant-design:down-square-twotone',
'vi-ant-design:download-outlined',
'vi-ant-design:drag-outlined',
'vi-ant-design:dribbble-circle-filled',
'vi-ant-design:dribbble-outlined',
'vi-ant-design:dribbble-square-filled',
'vi-ant-design:dribbble-square-outlined',
'vi-ant-design:dropbox-circle-filled',
'vi-ant-design:dropbox-outlined',
'vi-ant-design:dropbox-square-filled',
'vi-ant-design:edit-filled',
'vi-ant-design:edit-outlined',
'vi-ant-design:edit-twotone',
'vi-ant-design:ellipsis-outlined',
'vi-ant-design:enter-outlined',
'vi-ant-design:environment-filled',
'vi-ant-design:environment-outlined',
'vi-ant-design:environment-twotone',
'vi-ant-design:euro-circle-filled',
'vi-ant-design:euro-circle-outlined',
'vi-ant-design:euro-circle-twotone',
'vi-ant-design:euro-outlined',
'vi-ant-design:euro-twotone',
'vi-ant-design:exception-outlined',
'vi-ant-design:exclamation-circle-filled',
'vi-ant-design:exclamation-circle-outlined',
'vi-ant-design:exclamation-circle-twotone',
'vi-ant-design:exclamation-outlined',
'vi-ant-design:expand-alt-outlined',
'vi-ant-design:expand-outlined',
'vi-ant-design:experiment-filled',
'vi-ant-design:experiment-outlined',
'vi-ant-design:experiment-twotone',
'vi-ant-design:export-outlined',
'vi-ant-design:eye-filled',
'vi-ant-design:eye-invisible-filled',
'vi-ant-design:eye-invisible-outlined',
'vi-ant-design:eye-invisible-twotone',
'vi-ant-design:eye-outlined',
'vi-ant-design:eye-twotone',
'vi-ant-design:facebook-filled',
'vi-ant-design:facebook-outlined',
'vi-ant-design:fall-outlined',
'vi-ant-design:fast-backward-filled',
'vi-ant-design:fast-backward-outlined',
'vi-ant-design:fast-forward-filled',
'vi-ant-design:fast-forward-outlined',
'vi-ant-design:field-binary-outlined',
'vi-ant-design:field-number-outlined',
'vi-ant-design:field-string-outlined',
'vi-ant-design:field-time-outlined',
'vi-ant-design:file-add-filled',
'vi-ant-design:file-add-outlined',
'vi-ant-design:file-add-twotone',
'vi-ant-design:file-done-outlined',
'vi-ant-design:file-excel-filled',
'vi-ant-design:file-excel-outlined',
'vi-ant-design:file-excel-twotone',
'vi-ant-design:file-exclamation-filled',
'vi-ant-design:file-exclamation-outlined',
'vi-ant-design:file-exclamation-twotone',
'vi-ant-design:file-filled',
'vi-ant-design:file-gif-outlined',
'vi-ant-design:file-image-filled',
'vi-ant-design:file-image-outlined',
'vi-ant-design:file-image-twotone',
'vi-ant-design:file-jpg-outlined',
'vi-ant-design:file-markdown-filled',
'vi-ant-design:file-markdown-outlined',
'vi-ant-design:file-markdown-twotone',
'vi-ant-design:file-outlined',
'vi-ant-design:file-pdf-filled',
'vi-ant-design:file-pdf-outlined',
'vi-ant-design:file-pdf-twotone',
'vi-ant-design:file-ppt-filled',
'vi-ant-design:file-ppt-outlined',
'vi-ant-design:file-ppt-twotone',
'vi-ant-design:file-protect-outlined',
'vi-ant-design:file-search-outlined',
'vi-ant-design:file-sync-outlined',
'vi-ant-design:file-text-filled',
'vi-ant-design:file-text-outlined',
'vi-ant-design:file-text-twotone',
'vi-ant-design:file-twotone',
'vi-ant-design:file-unknown-filled',
'vi-ant-design:file-unknown-outlined',
'vi-ant-design:file-unknown-twotone',
'vi-ant-design:file-word-filled',
'vi-ant-design:file-word-outlined',
'vi-ant-design:file-word-twotone',
'vi-ant-design:file-zip-filled',
'vi-ant-design:file-zip-outlined',
'vi-ant-design:file-zip-twotone',
'vi-ant-design:filter-filled',
'vi-ant-design:filter-outlined',
'vi-ant-design:filter-twotone',
'vi-ant-design:fire-filled',
'vi-ant-design:fire-outlined',
'vi-ant-design:fire-twotone',
'vi-ant-design:flag-filled',
'vi-ant-design:flag-outlined',
'vi-ant-design:flag-twotone',
'vi-ant-design:folder-add-filled',
'vi-ant-design:folder-add-outlined',
'vi-ant-design:folder-add-twotone',
'vi-ant-design:folder-filled',
'vi-ant-design:folder-open-filled',
'vi-ant-design:folder-open-outlined',
'vi-ant-design:folder-open-twotone',
'vi-ant-design:folder-outlined',
'vi-ant-design:folder-twotone',
'vi-ant-design:folder-view-outlined',
'vi-ant-design:font-colors-outlined',
'vi-ant-design:font-size-outlined',
'vi-ant-design:fork-outlined',
'vi-ant-design:form-outlined',
'vi-ant-design:format-painter-filled',
'vi-ant-design:format-painter-outlined',
'vi-ant-design:forward-filled',
'vi-ant-design:forward-outlined',
'vi-ant-design:frown-filled',
'vi-ant-design:frown-outlined',
'vi-ant-design:frown-twotone',
'vi-ant-design:fullscreen-exit-outlined',
'vi-ant-design:fullscreen-outlined',
'vi-ant-design:function-outlined',
'vi-ant-design:fund-filled',
'vi-ant-design:fund-outlined',
'vi-ant-design:fund-projection-screen-outlined',
'vi-ant-design:fund-twotone',
'vi-ant-design:fund-view-outlined',
'vi-ant-design:funnel-plot-filled',
'vi-ant-design:funnel-plot-outlined',
'vi-ant-design:funnel-plot-twotone',
'vi-ant-design:gateway-outlined',
'vi-ant-design:gif-outlined',
'vi-ant-design:gift-filled',
'vi-ant-design:gift-outlined',
'vi-ant-design:gift-twotone',
'vi-ant-design:github-filled',
'vi-ant-design:github-outlined',
'vi-ant-design:gitlab-filled',
'vi-ant-design:gitlab-outlined',
'vi-ant-design:global-outlined',
'vi-ant-design:gold-filled',
'vi-ant-design:gold-outlined',
'vi-ant-design:gold-twotone',
'vi-ant-design:golden-filled',
'vi-ant-design:google-circle-filled',
'vi-ant-design:google-outlined',
'vi-ant-design:google-plus-circle-filled',
'vi-ant-design:google-plus-outlined',
'vi-ant-design:google-plus-square-filled',
'vi-ant-design:google-square-filled',
'vi-ant-design:group-outlined',
'vi-ant-design:harmony-o-s-outlined',
'vi-ant-design:hdd-filled',
'vi-ant-design:hdd-outlined',
'vi-ant-design:hdd-twotone',
'vi-ant-design:heart-filled',
'vi-ant-design:heart-outlined',
'vi-ant-design:heart-twotone',
'vi-ant-design:heat-map-outlined',
'vi-ant-design:highlight-filled',
'vi-ant-design:highlight-outlined',
'vi-ant-design:highlight-twotone',
'vi-ant-design:history-outlined',
'vi-ant-design:holder-outlined',
'vi-ant-design:home-filled',
'vi-ant-design:home-outlined',
'vi-ant-design:home-twotone',
'vi-ant-design:hourglass-filled',
'vi-ant-design:hourglass-outlined',
'vi-ant-design:hourglass-twotone',
'vi-ant-design:html5-filled',
'vi-ant-design:html5-outlined',
'vi-ant-design:html5-twotone',
'vi-ant-design:idcard-filled',
'vi-ant-design:idcard-outlined',
'vi-ant-design:idcard-twotone',
'vi-ant-design:ie-circle-filled',
'vi-ant-design:ie-outlined',
'vi-ant-design:ie-square-filled',
'vi-ant-design:import-outlined',
'vi-ant-design:inbox-outlined',
'vi-ant-design:info-circle-filled',
'vi-ant-design:info-circle-outlined',
'vi-ant-design:info-circle-twotone',
'vi-ant-design:info-outlined',
'vi-ant-design:insert-row-above-outlined',
'vi-ant-design:insert-row-below-outlined',
'vi-ant-design:insert-row-left-outlined',
'vi-ant-design:insert-row-right-outlined',
'vi-ant-design:instagram-filled',
'vi-ant-design:instagram-outlined',
'vi-ant-design:insurance-filled',
'vi-ant-design:insurance-outlined',
'vi-ant-design:insurance-twotone',
'vi-ant-design:interaction-filled',
'vi-ant-design:interaction-outlined',
'vi-ant-design:interaction-twotone',
'vi-ant-design:issues-close-outlined',
'vi-ant-design:italic-outlined',
'vi-ant-design:java-outlined',
'vi-ant-design:java-script-outlined',
'vi-ant-design:key-outlined',
'vi-ant-design:kubernetes-outlined',
'vi-ant-design:laptop-outlined',
'vi-ant-design:layout-filled',
'vi-ant-design:layout-outlined',
'vi-ant-design:layout-twotone',
'vi-ant-design:left-circle-filled',
'vi-ant-design:left-circle-outlined',
'vi-ant-design:left-circle-twotone',
'vi-ant-design:left-outlined',
'vi-ant-design:left-square-filled',
'vi-ant-design:left-square-outlined',
'vi-ant-design:left-square-twotone',
'vi-ant-design:like-filled',
'vi-ant-design:like-outlined',
'vi-ant-design:like-twotone',
'vi-ant-design:line-chart-outlined',
'vi-ant-design:line-height-outlined',
'vi-ant-design:line-outlined',
'vi-ant-design:link-outlined',
'vi-ant-design:linkedin-filled',
'vi-ant-design:linkedin-outlined',
'vi-ant-design:linux-outlined',
'vi-ant-design:loading-3-quarters-outlined',
'vi-ant-design:loading-outlined',
'vi-ant-design:lock-filled',
'vi-ant-design:lock-outlined',
'vi-ant-design:lock-twotone',
'vi-ant-design:login-outlined',
'vi-ant-design:logout-outlined',
'vi-ant-design:mac-command-filled',
'vi-ant-design:mac-command-outlined',
'vi-ant-design:mail-filled',
'vi-ant-design:mail-outlined',
'vi-ant-design:mail-twotone',
'vi-ant-design:man-outlined',
'vi-ant-design:medicine-box-filled',
'vi-ant-design:medicine-box-outlined',
'vi-ant-design:medicine-box-twotone',
'vi-ant-design:medium-circle-filled',
'vi-ant-design:medium-outlined',
'vi-ant-design:medium-square-filled',
'vi-ant-design:medium-workmark-outlined',
'vi-ant-design:meh-filled',
'vi-ant-design:meh-outlined',
'vi-ant-design:meh-twotone',
'vi-ant-design:menu-fold-outlined',
'vi-ant-design:menu-outlined',
'vi-ant-design:menu-unfold-outlined',
'vi-ant-design:merge-cells-outlined',
'vi-ant-design:merge-filled',
'vi-ant-design:merge-outlined',
'vi-ant-design:message-filled',
'vi-ant-design:message-outlined',
'vi-ant-design:message-twotone',
'vi-ant-design:minus-circle-filled',
'vi-ant-design:minus-circle-outlined',
'vi-ant-design:minus-circle-twotone',
'vi-ant-design:minus-outlined',
'vi-ant-design:minus-square-filled',
'vi-ant-design:minus-square-outlined',
'vi-ant-design:minus-square-twotone',
'vi-ant-design:mobile-filled',
'vi-ant-design:mobile-outlined',
'vi-ant-design:mobile-twotone',
'vi-ant-design:money-collect-filled',
'vi-ant-design:money-collect-outlined',
'vi-ant-design:money-collect-twotone',
'vi-ant-design:monitor-outlined',
'vi-ant-design:moon-filled',
'vi-ant-design:moon-outlined',
'vi-ant-design:more-outlined',
'vi-ant-design:muted-filled',
'vi-ant-design:muted-outlined',
'vi-ant-design:node-collapse-outlined',
'vi-ant-design:node-expand-outlined',
'vi-ant-design:node-index-outlined',
'vi-ant-design:notification-filled',
'vi-ant-design:notification-outlined',
'vi-ant-design:notification-twotone',
'vi-ant-design:number-outlined',
'vi-ant-design:one-to-one-outlined',
'vi-ant-design:open-a-i-filled',
'vi-ant-design:open-a-i-outlined',
'vi-ant-design:ordered-list-outlined',
'vi-ant-design:paper-clip-outlined',
'vi-ant-design:partition-outlined',
'vi-ant-design:pause-circle-filled',
'vi-ant-design:pause-circle-outlined',
'vi-ant-design:pause-circle-twotone',
'vi-ant-design:pause-outlined',
'vi-ant-design:pay-circle-filled',
'vi-ant-design:pay-circle-outlined',
'vi-ant-design:percentage-outlined',
'vi-ant-design:phone-filled',
'vi-ant-design:phone-outlined',
'vi-ant-design:phone-twotone',
'vi-ant-design:pic-center-outlined',
'vi-ant-design:pic-left-outlined',
'vi-ant-design:pic-right-outlined',
'vi-ant-design:picture-filled',
'vi-ant-design:picture-outlined',
'vi-ant-design:picture-twotone',
'vi-ant-design:pie-chart-filled',
'vi-ant-design:pie-chart-outlined',
'vi-ant-design:pie-chart-twotone',
'vi-ant-design:pinterest-filled',
'vi-ant-design:pinterest-outlined',
'vi-ant-design:play-circle-filled',
'vi-ant-design:play-circle-outlined',
'vi-ant-design:play-circle-twotone',
'vi-ant-design:play-square-filled',
'vi-ant-design:play-square-outlined',
'vi-ant-design:play-square-twotone',
'vi-ant-design:plus-circle-filled',
'vi-ant-design:plus-circle-outlined',
'vi-ant-design:plus-circle-twotone',
'vi-ant-design:plus-outlined',
'vi-ant-design:plus-square-filled',
'vi-ant-design:plus-square-outlined',
'vi-ant-design:plus-square-twotone',
'vi-ant-design:pound-circle-filled',
'vi-ant-design:pound-circle-outlined',
'vi-ant-design:pound-circle-twotone',
'vi-ant-design:pound-outlined',
'vi-ant-design:poweroff-outlined',
'vi-ant-design:printer-filled',
'vi-ant-design:printer-outlined',
'vi-ant-design:printer-twotone',
'vi-ant-design:product-filled',
'vi-ant-design:product-outlined',
'vi-ant-design:profile-filled',
'vi-ant-design:profile-outlined',
'vi-ant-design:profile-twotone',
'vi-ant-design:project-filled',
'vi-ant-design:project-outlined',
'vi-ant-design:project-twotone',
'vi-ant-design:property-safety-filled',
'vi-ant-design:property-safety-outlined',
'vi-ant-design:property-safety-twotone',
'vi-ant-design:pull-request-outlined',
'vi-ant-design:pushpin-filled',
'vi-ant-design:pushpin-outlined',
'vi-ant-design:pushpin-twotone',
'vi-ant-design:python-outlined',
'vi-ant-design:qq-circle-filled',
'vi-ant-design:qq-outlined',
'vi-ant-design:qq-square-filled',
'vi-ant-design:qrcode-outlined',
'vi-ant-design:question-circle-filled',
'vi-ant-design:question-circle-outlined',
'vi-ant-design:question-circle-twotone',
'vi-ant-design:question-outlined',
'vi-ant-design:radar-chart-outlined',
'vi-ant-design:radius-bottomleft-outlined',
'vi-ant-design:radius-bottomright-outlined',
'vi-ant-design:radius-setting-outlined',
'vi-ant-design:radius-upleft-outlined',
'vi-ant-design:radius-upright-outlined',
'vi-ant-design:read-filled',
'vi-ant-design:read-outlined',
'vi-ant-design:reconciliation-filled',
'vi-ant-design:reconciliation-outlined',
'vi-ant-design:reconciliation-twotone',
'vi-ant-design:red-envelope-filled',
'vi-ant-design:red-envelope-outlined',
'vi-ant-design:red-envelope-twotone',
'vi-ant-design:reddit-circle-filled',
'vi-ant-design:reddit-outlined',
'vi-ant-design:reddit-square-filled',
'vi-ant-design:redo-outlined',
'vi-ant-design:reload-outlined',
'vi-ant-design:rest-filled',
'vi-ant-design:rest-outlined',
'vi-ant-design:rest-twotone',
'vi-ant-design:retweet-outlined',
'vi-ant-design:right-circle-filled',
'vi-ant-design:right-circle-outlined',
'vi-ant-design:right-circle-twotone',
'vi-ant-design:right-outlined',
'vi-ant-design:right-square-filled',
'vi-ant-design:right-square-outlined',
'vi-ant-design:right-square-twotone',
'vi-ant-design:rise-outlined',
'vi-ant-design:robot-filled',
'vi-ant-design:robot-outlined',
'vi-ant-design:rocket-filled',
'vi-ant-design:rocket-outlined',
'vi-ant-design:rocket-twotone',
'vi-ant-design:rollback-outlined',
'vi-ant-design:rotate-left-outlined',
'vi-ant-design:rotate-right-outlined',
'vi-ant-design:ruby-outlined',
'vi-ant-design:safety-certificate-filled',
'vi-ant-design:safety-certificate-outlined',
'vi-ant-design:safety-certificate-twotone',
'vi-ant-design:safety-outlined',
'vi-ant-design:save-filled',
'vi-ant-design:save-outlined',
'vi-ant-design:save-twotone',
'vi-ant-design:scan-outlined',
'vi-ant-design:schedule-filled',
'vi-ant-design:schedule-outlined',
'vi-ant-design:schedule-twotone',
'vi-ant-design:scissor-outlined',
'vi-ant-design:search-outlined',
'vi-ant-design:security-scan-filled',
'vi-ant-design:security-scan-outlined',
'vi-ant-design:security-scan-twotone',
'vi-ant-design:select-outlined',
'vi-ant-design:send-outlined',
'vi-ant-design:setting-filled',
'vi-ant-design:setting-outlined',
'vi-ant-design:setting-twotone',
'vi-ant-design:shake-outlined',
'vi-ant-design:share-alt-outlined',
'vi-ant-design:shop-filled',
'vi-ant-design:shop-outlined',
'vi-ant-design:shop-twotone',
'vi-ant-design:shopping-cart-outlined',
'vi-ant-design:shopping-filled',
'vi-ant-design:shopping-outlined',
'vi-ant-design:shopping-twotone',
'vi-ant-design:shrink-outlined',
'vi-ant-design:signal-filled',
'vi-ant-design:signature-filled',
'vi-ant-design:signature-outlined',
'vi-ant-design:sisternode-outlined',
'vi-ant-design:sketch-circle-filled',
'vi-ant-design:sketch-outlined',
'vi-ant-design:sketch-square-filled',
'vi-ant-design:skin-filled',
'vi-ant-design:skin-outlined',
'vi-ant-design:skin-twotone',
'vi-ant-design:skype-filled',
'vi-ant-design:skype-outlined',
'vi-ant-design:slack-circle-filled',
'vi-ant-design:slack-outlined',
'vi-ant-design:slack-square-filled',
'vi-ant-design:slack-square-outlined',
'vi-ant-design:sliders-filled',
'vi-ant-design:sliders-outlined',
'vi-ant-design:sliders-twotone',
'vi-ant-design:small-dash-outlined',
'vi-ant-design:smile-filled',
'vi-ant-design:smile-outlined',
'vi-ant-design:smile-twotone',
'vi-ant-design:snippets-filled',
'vi-ant-design:snippets-outlined',
'vi-ant-design:snippets-twotone',
'vi-ant-design:solution-outlined',
'vi-ant-design:sort-ascending-outlined',
'vi-ant-design:sort-descending-outlined',
'vi-ant-design:sound-filled',
'vi-ant-design:sound-outlined',
'vi-ant-design:sound-twotone',
'vi-ant-design:split-cells-outlined',
'vi-ant-design:spotify-filled',
'vi-ant-design:spotify-outlined',
'vi-ant-design:star-filled',
'vi-ant-design:star-outlined',
'vi-ant-design:star-twotone',
'vi-ant-design:step-backward-filled',
'vi-ant-design:step-backward-outlined',
'vi-ant-design:step-forward-filled',
'vi-ant-design:step-forward-outlined',
'vi-ant-design:stock-outlined',
'vi-ant-design:stop-filled',
'vi-ant-design:stop-outlined',
'vi-ant-design:stop-twotone',
'vi-ant-design:strikethrough-outlined',
'vi-ant-design:subnode-outlined',
'vi-ant-design:sun-filled',
'vi-ant-design:sun-outlined',
'vi-ant-design:swap-left-outlined',
'vi-ant-design:swap-outlined',
'vi-ant-design:swap-right-outlined',
'vi-ant-design:switcher-filled',
'vi-ant-design:switcher-outlined',
'vi-ant-design:switcher-twotone',
'vi-ant-design:sync-outlined',
'vi-ant-design:table-outlined',
'vi-ant-design:tablet-filled',
'vi-ant-design:tablet-outlined',
'vi-ant-design:tablet-twotone',
'vi-ant-design:tag-filled',
'vi-ant-design:tag-outlined',
'vi-ant-design:tag-twotone',
'vi-ant-design:tags-filled',
'vi-ant-design:tags-outlined',
'vi-ant-design:tags-twotone',
'vi-ant-design:taobao-circle-filled',
'vi-ant-design:taobao-circle-outlined',
'vi-ant-design:taobao-outlined',
'vi-ant-design:taobao-square-filled',
'vi-ant-design:team-outlined',
'vi-ant-design:thunderbolt-filled',
'vi-ant-design:thunderbolt-outlined',
'vi-ant-design:thunderbolt-twotone',
'vi-ant-design:tik-tok-filled',
'vi-ant-design:tik-tok-outlined',
'vi-ant-design:to-top-outlined',
'vi-ant-design:tool-filled',
'vi-ant-design:tool-outlined',
'vi-ant-design:tool-twotone',
'vi-ant-design:trademark-circle-filled',
'vi-ant-design:trademark-circle-outlined',
'vi-ant-design:trademark-circle-twotone',
'vi-ant-design:trademark-outlined',
'vi-ant-design:transaction-outlined',
'vi-ant-design:translation-outlined',
'vi-ant-design:trophy-filled',
'vi-ant-design:trophy-outlined',
'vi-ant-design:trophy-twotone',
'vi-ant-design:truck-filled',
'vi-ant-design:truck-outlined',
'vi-ant-design:twitch-outlined',
'vi-ant-design:twitter-circle-filled',
'vi-ant-design:twitter-outlined',
'vi-ant-design:twitter-square-filled',
'vi-ant-design:underline-outlined',
'vi-ant-design:undo-outlined',
'vi-ant-design:ungroup-outlined',
'vi-ant-design:unlock-filled',
'vi-ant-design:unlock-outlined',
'vi-ant-design:unlock-twotone',
'vi-ant-design:unordered-list-outlined',
'vi-ant-design:up-circle-filled',
'vi-ant-design:up-circle-outlined',
'vi-ant-design:up-circle-twotone',
'vi-ant-design:up-outlined',
'vi-ant-design:up-square-filled',
'vi-ant-design:up-square-outlined',
'vi-ant-design:up-square-twotone',
'vi-ant-design:upload-outlined',
'vi-ant-design:usb-filled',
'vi-ant-design:usb-outlined',
'vi-ant-design:usb-twotone',
'vi-ant-design:user-add-outlined',
'vi-ant-design:user-delete-outlined',
'vi-ant-design:user-outlined',
'vi-ant-design:user-switch-outlined',
'vi-ant-design:usergroup-add-outlined',
'vi-ant-design:usergroup-delete-outlined',
'vi-ant-design:verified-outlined',
'vi-ant-design:vertical-align-bottom-outlined',
'vi-ant-design:vertical-align-middle-outlined',
'vi-ant-design:vertical-align-top-outlined',
'vi-ant-design:vertical-left-outlined',
'vi-ant-design:vertical-right-outlined',
'vi-ant-design:video-camera-add-outlined',
'vi-ant-design:video-camera-filled',
'vi-ant-design:video-camera-outlined',
'vi-ant-design:video-camera-twotone',
'vi-ant-design:wallet-filled',
'vi-ant-design:wallet-outlined',
'vi-ant-design:wallet-twotone',
'vi-ant-design:warning-filled',
'vi-ant-design:warning-outlined',
'vi-ant-design:warning-twotone',
'vi-ant-design:wechat-filled',
'vi-ant-design:wechat-outlined',
'vi-ant-design:wechat-work-filled',
'vi-ant-design:wechat-work-outlined',
'vi-ant-design:weibo-circle-filled',
'vi-ant-design:weibo-circle-outlined',
'vi-ant-design:weibo-outlined',
'vi-ant-design:weibo-square-filled',
'vi-ant-design:weibo-square-outlined',
'vi-ant-design:whats-app-outlined',
'vi-ant-design:wifi-outlined',
'vi-ant-design:windows-filled',
'vi-ant-design:windows-outlined',
'vi-ant-design:woman-outlined',
'vi-ant-design:x-filled',
'vi-ant-design:x-outlined',
'vi-ant-design:yahoo-filled',
'vi-ant-design:yahoo-outlined',
'vi-ant-design:youtube-filled',
'vi-ant-design:youtube-outlined',
'vi-ant-design:yuque-filled',
'vi-ant-design:yuque-outlined',
'vi-ant-design:zhihu-circle-filled',
'vi-ant-design:zhihu-outlined',
'vi-ant-design:zhihu-square-filled',
'vi-ant-design:zoom-in-outlined',
'vi-ant-design:zoom-out-outlined'
]
}

View File

@ -1,299 +0,0 @@
export default {
name: 'Element Plus',
prefix: 'vi-ep',
icons: [
'vi-ep:add-location',
'vi-ep:aim',
'vi-ep:alarm-clock',
'vi-ep:apple',
'vi-ep:arrow-down',
'vi-ep:arrow-down-bold',
'vi-ep:arrow-left',
'vi-ep:arrow-left-bold',
'vi-ep:arrow-right',
'vi-ep:arrow-right-bold',
'vi-ep:arrow-up',
'vi-ep:arrow-up-bold',
'vi-ep:avatar',
'vi-ep:back',
'vi-ep:baseball',
'vi-ep:basketball',
'vi-ep:bell',
'vi-ep:bell-filled',
'vi-ep:bicycle',
'vi-ep:bottom',
'vi-ep:bottom-left',
'vi-ep:bottom-right',
'vi-ep:bowl',
'vi-ep:box',
'vi-ep:briefcase',
'vi-ep:brush',
'vi-ep:brush-filled',
'vi-ep:burger',
'vi-ep:calendar',
'vi-ep:camera',
'vi-ep:camera-filled',
'vi-ep:caret-bottom',
'vi-ep:caret-left',
'vi-ep:caret-right',
'vi-ep:caret-top',
'vi-ep:cellphone',
'vi-ep:chat-dot-round',
'vi-ep:chat-dot-square',
'vi-ep:chat-line-round',
'vi-ep:chat-line-square',
'vi-ep:chat-round',
'vi-ep:chat-square',
'vi-ep:check',
'vi-ep:checked',
'vi-ep:cherry',
'vi-ep:chicken',
'vi-ep:chrome-filled',
'vi-ep:circle-check',
'vi-ep:circle-check-filled',
'vi-ep:circle-close',
'vi-ep:circle-close-filled',
'vi-ep:circle-plus',
'vi-ep:circle-plus-filled',
'vi-ep:clock',
'vi-ep:close',
'vi-ep:close-bold',
'vi-ep:cloudy',
'vi-ep:coffee',
'vi-ep:coffee-cup',
'vi-ep:coin',
'vi-ep:cold-drink',
'vi-ep:collection',
'vi-ep:collection-tag',
'vi-ep:comment',
'vi-ep:compass',
'vi-ep:connection',
'vi-ep:coordinate',
'vi-ep:copy-document',
'vi-ep:cpu',
'vi-ep:credit-card',
'vi-ep:crop',
'vi-ep:d-arrow-left',
'vi-ep:d-arrow-right',
'vi-ep:d-caret',
'vi-ep:data-analysis',
'vi-ep:data-board',
'vi-ep:data-line',
'vi-ep:delete',
'vi-ep:delete-filled',
'vi-ep:delete-location',
'vi-ep:dessert',
'vi-ep:discount',
'vi-ep:dish',
'vi-ep:dish-dot',
'vi-ep:document',
'vi-ep:document-add',
'vi-ep:document-checked',
'vi-ep:document-copy',
'vi-ep:document-delete',
'vi-ep:document-remove',
'vi-ep:download',
'vi-ep:drizzling',
'vi-ep:edit',
'vi-ep:edit-pen',
'vi-ep:eleme',
'vi-ep:eleme-filled',
'vi-ep:element-plus',
'vi-ep:expand',
'vi-ep:failed',
'vi-ep:female',
'vi-ep:files',
'vi-ep:film',
'vi-ep:filter',
'vi-ep:finished',
'vi-ep:first-aid-kit',
'vi-ep:flag',
'vi-ep:fold',
'vi-ep:folder',
'vi-ep:folder-add',
'vi-ep:folder-checked',
'vi-ep:folder-delete',
'vi-ep:folder-opened',
'vi-ep:folder-remove',
'vi-ep:food',
'vi-ep:football',
'vi-ep:fork-spoon',
'vi-ep:fries',
'vi-ep:full-screen',
'vi-ep:goblet',
'vi-ep:goblet-full',
'vi-ep:goblet-square',
'vi-ep:goblet-square-full',
'vi-ep:gold-medal',
'vi-ep:goods',
'vi-ep:goods-filled',
'vi-ep:grape',
'vi-ep:grid',
'vi-ep:guide',
'vi-ep:handbag',
'vi-ep:headset',
'vi-ep:help',
'vi-ep:help-filled',
'vi-ep:hide',
'vi-ep:histogram',
'vi-ep:home-filled',
'vi-ep:hot-water',
'vi-ep:house',
'vi-ep:ice-cream',
'vi-ep:ice-cream-round',
'vi-ep:ice-cream-square',
'vi-ep:ice-drink',
'vi-ep:ice-tea',
'vi-ep:info-filled',
'vi-ep:iphone',
'vi-ep:key',
'vi-ep:knife-fork',
'vi-ep:lightning',
'vi-ep:link',
'vi-ep:list',
'vi-ep:loading',
'vi-ep:location',
'vi-ep:location-filled',
'vi-ep:location-information',
'vi-ep:lock',
'vi-ep:lollipop',
'vi-ep:magic-stick',
'vi-ep:magnet',
'vi-ep:male',
'vi-ep:management',
'vi-ep:map-location',
'vi-ep:medal',
'vi-ep:memo',
'vi-ep:menu',
'vi-ep:message',
'vi-ep:message-box',
'vi-ep:mic',
'vi-ep:microphone',
'vi-ep:milk-tea',
'vi-ep:minus',
'vi-ep:money',
'vi-ep:monitor',
'vi-ep:moon',
'vi-ep:moon-night',
'vi-ep:more',
'vi-ep:more-filled',
'vi-ep:mostly-cloudy',
'vi-ep:mouse',
'vi-ep:mug',
'vi-ep:mute',
'vi-ep:mute-notification',
'vi-ep:no-smoking',
'vi-ep:notebook',
'vi-ep:notification',
'vi-ep:odometer',
'vi-ep:office-building',
'vi-ep:open',
'vi-ep:operation',
'vi-ep:opportunity',
'vi-ep:orange',
'vi-ep:paperclip',
'vi-ep:partly-cloudy',
'vi-ep:pear',
'vi-ep:phone',
'vi-ep:phone-filled',
'vi-ep:picture',
'vi-ep:picture-filled',
'vi-ep:picture-rounded',
'vi-ep:pie-chart',
'vi-ep:place',
'vi-ep:platform',
'vi-ep:plus',
'vi-ep:pointer',
'vi-ep:position',
'vi-ep:postcard',
'vi-ep:pouring',
'vi-ep:present',
'vi-ep:price-tag',
'vi-ep:printer',
'vi-ep:promotion',
'vi-ep:quartz-watch',
'vi-ep:question-filled',
'vi-ep:rank',
'vi-ep:reading',
'vi-ep:reading-lamp',
'vi-ep:refresh',
'vi-ep:refresh-left',
'vi-ep:refresh-right',
'vi-ep:refrigerator',
'vi-ep:remove',
'vi-ep:remove-filled',
'vi-ep:right',
'vi-ep:scale-to-original',
'vi-ep:school',
'vi-ep:scissor',
'vi-ep:search',
'vi-ep:select',
'vi-ep:sell',
'vi-ep:semi-select',
'vi-ep:service',
'vi-ep:set-up',
'vi-ep:setting',
'vi-ep:share',
'vi-ep:ship',
'vi-ep:shop',
'vi-ep:shopping-bag',
'vi-ep:shopping-cart',
'vi-ep:shopping-cart-full',
'vi-ep:shopping-trolley',
'vi-ep:smoking',
'vi-ep:soccer',
'vi-ep:sold-out',
'vi-ep:sort',
'vi-ep:sort-down',
'vi-ep:sort-up',
'vi-ep:stamp',
'vi-ep:star',
'vi-ep:star-filled',
'vi-ep:stopwatch',
'vi-ep:success-filled',
'vi-ep:sugar',
'vi-ep:suitcase',
'vi-ep:suitcase-line',
'vi-ep:sunny',
'vi-ep:sunrise',
'vi-ep:sunset',
'vi-ep:switch',
'vi-ep:switch-button',
'vi-ep:switch-filled',
'vi-ep:takeaway-box',
'vi-ep:ticket',
'vi-ep:tickets',
'vi-ep:timer',
'vi-ep:toilet-paper',
'vi-ep:tools',
'vi-ep:top',
'vi-ep:top-left',
'vi-ep:top-right',
'vi-ep:trend-charts',
'vi-ep:trophy',
'vi-ep:trophy-base',
'vi-ep:turn-off',
'vi-ep:umbrella',
'vi-ep:unlock',
'vi-ep:upload',
'vi-ep:upload-filled',
'vi-ep:user',
'vi-ep:user-filled',
'vi-ep:van',
'vi-ep:video-camera',
'vi-ep:video-camera-filled',
'vi-ep:video-pause',
'vi-ep:video-play',
'vi-ep:view',
'vi-ep:wallet',
'vi-ep:wallet-filled',
'vi-ep:warn-triangle-filled',
'vi-ep:warning',
'vi-ep:warning-filled',
'vi-ep:watch',
'vi-ep:watermelon',
'vi-ep:wind-power',
'vi-ep:zoom-in',
'vi-ep:zoom-out'
]
}

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +0,0 @@
import ImageCropping from './src/ImageCropping.vue'
export { ImageCropping }

Some files were not shown because too many files have changed in this diff Show More