Compare commits
29 Commits
Author | SHA1 | Date |
---|---|---|
|
9caa008551 | |
|
7c18060e18 | |
|
4891f49b7d | |
|
07ca222ee0 | |
|
bfda9f6485 | |
|
67a202fef3 | |
|
48c5c9af8a | |
|
1af33d8a7e | |
|
9eb1356c4e | |
|
6a83d08309 | |
|
607b73a7b3 | |
|
a1e89b7c8a | |
|
d93d1ee6a0 | |
|
96c5a968ef | |
|
c954f2b7e0 | |
|
1df9644a11 | |
|
47f4b5a8ae | |
|
fbe68ba683 | |
|
9652712677 | |
|
7959b6c62a | |
|
25e416e3bb | |
|
5d1356c4a9 | |
|
b0daac8471 | |
|
d46119e174 | |
|
7efed9ed12 | |
|
5f2048d52d | |
|
97c293bc6e | |
|
c3a2cc0a5f | |
|
255843d4c0 |
|
@ -1,5 +0,0 @@
|
|||
Android 4.1
|
||||
IOS 7.1
|
||||
Chrome > 31
|
||||
ff > 31
|
||||
ie >= 11
|
|
@ -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
|
5
.env.dev
5
.env.dev
|
@ -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
|
|
@ -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
|
5
.env.pro
5
.env.pro
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,8 @@
|
|||
/build/
|
||||
/config/
|
||||
/dist/
|
||||
/*.js
|
||||
/test/unit/coverage/
|
||||
/node_modules/*
|
||||
/dist*
|
||||
/src/main.ts
|
|
@ -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'
|
||||
}
|
||||
})
|
|
@ -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操作
|
|
@ -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}]'
|
|
@ -4,6 +4,6 @@ dist
|
|||
dist-ssr
|
||||
*.local
|
||||
/dist*
|
||||
*-lock.*
|
||||
pnpm-debug
|
||||
stats.html
|
||||
.idea
|
||||
|
|
|
@ -1 +1,4 @@
|
|||
npx --no -- commitlint --edit $1
|
||||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
pnpm commitlint --edit "$1"
|
||||
|
|
|
@ -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'],
|
|
@ -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
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
/dist*
|
||||
/public/*
|
||||
/docs/*
|
||||
/vite.config.ts
|
||||
/src/types/env.d.ts
|
||||
/docs/**/*
|
||||
/plop/**/*
|
||||
|
|
|
@ -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",
|
||||
|
|
554
CHANGELOG.md
554
CHANGELOG.md
|
@ -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菜单组件显示bug,renderMenuItem返回的数组存在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)
|
||||
|
||||
|
||||
|
|
|
@ -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" ]
|
32
README.md
32
README.md
|
@ -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) [](repo-size) [](last-commit) [](stars) [](forks) [](release) [](watchers)
|
||||
[](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)
|
||||
|
|
|
@ -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) [](repo-size) [](last-commit) [](stars) [](forks) [](release) [](watchers)
|
||||
[](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)
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
services:
|
||||
vue-element-plus-admin:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.dev
|
||||
ports:
|
||||
- "4000:4000"
|
||||
volumes:
|
||||
- /app/node_modules
|
||||
- .:/app
|
|
@ -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
|
||||
}
|
||||
})
|
|
@ -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[]
|
|
@ -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'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
|
@ -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'
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
|
@ -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
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
|
@ -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 }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
132
package.json
132
package.json
|
@ -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"
|
||||
|
|
|
@ -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)
|
11876
pnpm-lock.yaml
11876
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
@ -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()
|
12
src/App.vue
12
src/App.vue
|
@ -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%;
|
||||
|
|
|
@ -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' })
|
||||
}
|
|
@ -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' })
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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' })
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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 })
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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[]>> => {
|
||||
|
|
|
@ -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[]
|
||||
}
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
import request from '@/axios'
|
||||
|
||||
export const getMenuListApi = () => {
|
||||
return request.get({ url: '/mock/menu/list' })
|
||||
}
|
|
@ -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'
|
||||
})
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
export interface RequestResponse {
|
||||
data: string
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
import request from '@/axios'
|
||||
|
||||
export const getRoleListApi = () => {
|
||||
return request.get({ url: '/mock/role/table' })
|
||||
}
|
|
@ -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 } })
|
||||
}
|
|
@ -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 |
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
})
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
import Avatars from './src/Avatars.vue'
|
||||
|
||||
export type { AvatarItem } from './src/types'
|
||||
export { Avatars }
|
|
@ -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>
|
|
@ -1,4 +0,0 @@
|
|||
export interface AvatarItem {
|
||||
url: string
|
||||
name?: string
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 ''
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
import CodeEditor from './src/CodeEditor.vue'
|
||||
|
||||
export { CodeEditor }
|
|
@ -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>
|
|
@ -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'
|
||||
}
|
||||
]
|
|
@ -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"
|
||||
/>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
import CountTo from './src/CountTo.vue'
|
||||
|
||||
export { CountTo }
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
|
@ -1,3 +0,0 @@
|
|||
import Echart from './src/Echart.vue'
|
||||
|
||||
export { Echart }
|
|
@ -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>
|
|
@ -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
|
||||
}
|
||||
|
||||
// 编辑器配置
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
import Highlight from './src/Highlight.vue'
|
||||
|
||||
export { Highlight }
|
|
@ -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>
|
|
@ -1,4 +0,0 @@
|
|||
import IAgree from './src/IAgree.vue'
|
||||
|
||||
export type { LinkItem, IAgreeProps } from './src/types'
|
||||
export { IAgree }
|
|
@ -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>
|
|
@ -1,10 +0,0 @@
|
|||
export interface LinkItem {
|
||||
text: string
|
||||
url?: string
|
||||
onClick?: () => void
|
||||
}
|
||||
|
||||
export interface IAgreeProps {
|
||||
text: string
|
||||
link: LinkItem[]
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
import IconPicker from './src/IconPicker.vue'
|
||||
|
||||
export { IconPicker }
|
|
@ -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>
|
|
@ -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'
|
||||
]
|
||||
}
|
|
@ -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
|
@ -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
Loading…
Reference in New Issue