diff --git a/.env b/.env index d6808d3b8a56a45c7e749ec757c33259abd5b159..e96b5ba9551120f3a78dbbbe4488bcd1f9eebc5f 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ # env -VITE_APP_TITLE="quick后台管理系统" +VITE_APP_TITLE="quick-vue3-admin" VITE_PORT=3101 VITE_APP_BASE_URL='/' \ No newline at end of file diff --git a/README.en.md b/README.en.md index 678681401f2c0cace695bac9aad5c4265d402c7d..b2fce21a4091afa266214938fd207935b9ad2c04 100644 --- a/README.en.md +++ b/README.en.md @@ -1,26 +1,30 @@ -
quick-vue3-admin Logoquick-vue3-admin Logo

+
quick-vue3-admin Logo

**中文** | [English](./README.en.md) ## 简介 -quick-vue3-admin 是一款免费开源快速搭建中后台系统框架。本框架基于 vite2+element-plus 等最新主流技术并封装了通用的组件方便开发者提高工作效率。后期也会通过版本升级的方式来维护并更新,使开发者拥有一款长期并且稳定的脚手架。 +quick-vue3-admin 是一款免费开源快速搭建中后台系统框架。本框架基于 vite2、vue3、element-plus、pinia 等最新主流技术并封装了通用的组件方便开发者提高工作效率。后期也会通过版本升级的方式来维护并更新,使开发者拥有一款长期并且稳定的脚手架。本团队还提供了基于 quick 框架开发的各类业务项目,如有相关需求联系管理员。 ## 软件特色 -1. 使用前端最新技术栈 vite2、vue3 和 typescript +1. 使用 vite2、vue3、element-plus、pinia 和 typescript 等前言技术 2. 封装了通用的组件 3. 提供了系统管理常用功能模块 4. 提供权限管理模块 5. 动态菜单技术 6. 动态路由技术 -7. 前后端分离 -8. 官方提供稳定并长期维护的后端接口项目 +7. 使用 JWT 鉴权 +8. 使用中间件异常处理 +9. 前后端分离 +10. 提供免费帮助通道 +11. 免费提供框架演示环境 +12. 官方提供稳定并长期维护的 node 轻后端接口项目 ## 预览 -- [quick-vue3-admin](https://ainiteam.com:3101/) - 框架演示 +- [quick-vue3-admin](http://quick.ainiteam.com/) - 框架演示 演示账号密码:admin/123456 @@ -76,7 +80,7 @@ pnpm run build ## 寻求帮助 -1. 百度尝试解决 +1. 查看官方帮助文档 2. 发起 Issue 3. 加 quick 框架 QQ 群:558795174 @@ -93,3 +97,4 @@ pnpm run build 5. 点个 star 把 6. 如果你觉得这个项目对你有帮助,你可以帮作者买一杯咖啡表示支持! ![donate](./public/payImages/alipay.jpg) +7. 如需加入开源,请联系管理员 diff --git a/README.md b/README.md index c943d1acdb18c381091256025246d3e440dbb561..b2fce21a4091afa266214938fd207935b9ad2c04 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,26 @@ -
quick-vue3-admin Logoquick-vue3-admin Logo

+
quick-vue3-admin Logo

**中文** | [English](./README.en.md) ## 简介 -quick-vue3-admin 是一款免费开源快速搭建中后台系统框架。本框架基于 vite2+element-plus 等最新主流技术并封装了通用的组件方便开发者提高工作效率。后期也会通过版本升级的方式来维护并更新,使开发者拥有一款长期并且稳定的脚手架。 +quick-vue3-admin 是一款免费开源快速搭建中后台系统框架。本框架基于 vite2、vue3、element-plus、pinia 等最新主流技术并封装了通用的组件方便开发者提高工作效率。后期也会通过版本升级的方式来维护并更新,使开发者拥有一款长期并且稳定的脚手架。本团队还提供了基于 quick 框架开发的各类业务项目,如有相关需求联系管理员。 ## 软件特色 -1. 使用前端最新技术栈 vite2、vue3 和 typescript +1. 使用 vite2、vue3、element-plus、pinia 和 typescript 等前言技术 2. 封装了通用的组件 3. 提供了系统管理常用功能模块 4. 提供权限管理模块 5. 动态菜单技术 6. 动态路由技术 -7. 前后端分离 -8. 官方提供稳定并长期维护的后端接口项目 +7. 使用 JWT 鉴权 +8. 使用中间件异常处理 +9. 前后端分离 +10. 提供免费帮助通道 +11. 免费提供框架演示环境 +12. 官方提供稳定并长期维护的 node 轻后端接口项目 ## 预览 @@ -76,7 +80,7 @@ pnpm run build ## 寻求帮助 -1. 百度尝试解决 +1. 查看官方帮助文档 2. 发起 Issue 3. 加 quick 框架 QQ 群:558795174 @@ -93,3 +97,4 @@ pnpm run build 5. 点个 star 把 6. 如果你觉得这个项目对你有帮助,你可以帮作者买一杯咖啡表示支持! ![donate](./public/payImages/alipay.jpg) +7. 如需加入开源,请联系管理员 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72ba0baeded511c70531b0921c67d94a4bbb7a66..c8b6b3027a4b516aa593ea0c9cc0425483b2d85c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ specifiers: '@element-plus/icons-vue': ^2.0.6 '@types/js-md5': ^0.4.3 '@types/node': ^17.0.30 + '@types/nprogress': ^0.2.0 '@typescript-eslint/eslint-plugin': ^5.22.0 '@typescript-eslint/parser': ^5.22.0 '@vitejs/plugin-vue': ^2.3.1 @@ -18,9 +19,12 @@ specifiers: eslint-plugin-prettier: ^4.0.0 eslint-plugin-vue: ^8.7.1 husky: ^7.0.4 + js-cookie: ^3.0.1 js-md5: ^0.7.3 - pinia: ^2.0.13 + nprogress: ^0.2.0 + pinia: ^2.0.17 pinia-plugin-persist: ^1.0.0 + pinia-use-persist: ^0.0.21 prettier: 2.6.2 quick-vue3-ui: 1.0.5 sass: ^1.51.0 @@ -40,9 +44,12 @@ dependencies: axios: registry.npmmirror.com/axios/0.27.2 echarts: 5.3.2 element-plus: registry.npmmirror.com/element-plus/2.2.2_vue@3.2.36 + js-cookie: 3.0.1 js-md5: 0.7.3 - pinia: registry.npmmirror.com/pinia/2.0.14_typescript@4.7.2+vue@3.2.36 - pinia-plugin-persist: registry.npmmirror.com/pinia-plugin-persist/1.0.0_pinia@2.0.14+vue@3.2.36 + nprogress: 0.2.0 + pinia: 2.0.17_typescript@4.7.2+vue@3.2.36 + pinia-plugin-persist: registry.npmmirror.com/pinia-plugin-persist/1.0.0_pinia@2.0.17+vue@3.2.36 + pinia-use-persist: 0.0.21_typescript@4.7.2+vue@3.2.36 quick-vue3-ui: 1.0.5 vue: registry.npmmirror.com/vue/3.2.36 vue-i18n: registry.npmmirror.com/vue-i18n/9.1.10_vue@3.2.36 @@ -51,6 +58,7 @@ dependencies: devDependencies: '@types/js-md5': 0.4.3 '@types/node': registry.npmmirror.com/@types/node/17.0.35 + '@types/nprogress': 0.2.0 '@typescript-eslint/eslint-plugin': registry.npmmirror.com/@typescript-eslint/eslint-plugin/5.26.0_3e687f93547efbf7d61b629ca4d69a5c '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser/5.26.0_eslint@8.16.0+typescript@4.7.2 '@vitejs/plugin-vue': registry.npmmirror.com/@vitejs/plugin-vue/2.3.3_vite@2.9.9+vue@3.2.36 @@ -172,6 +180,10 @@ packages: resolution: {integrity: sha512-BIga/WEqTi35ccnGysOuO4RmwVnpajv9oDB/sDQSY2b7/Ac7RyYR30bv7otZwByMvOJV9Vqq6/O1DFAnOzE4Pg==} dev: true + /@types/nprogress/0.2.0: + resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==} + dev: true + /@vue/compiler-core/3.2.36: resolution: {integrity: sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==} dependencies: @@ -207,6 +219,10 @@ packages: '@vue/compiler-dom': 3.2.36 '@vue/shared': 3.2.36 + /@vue/devtools-api/6.2.1: + resolution: {integrity: sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==} + dev: false + /@vue/reactivity-transform/3.2.36: resolution: {integrity: sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==} dependencies: @@ -355,6 +371,10 @@ packages: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} dev: true + /crypto-js/4.1.1: + resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + dev: false + /css-select/4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} dependencies: @@ -733,6 +753,11 @@ packages: minimatch: 3.1.2 dev: true + /js-cookie/3.0.1: + resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} + engines: {node: '>=12'} + dev: false + /js-md5/0.7.3: resolution: {integrity: sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==} dev: false @@ -806,6 +831,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /nprogress/0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + dev: false + /nth-check/2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: @@ -838,6 +867,35 @@ packages: engines: {node: '>=8.6'} dev: true + /pinia-use-persist/0.0.21_typescript@4.7.2+vue@3.2.36: + resolution: {integrity: sha512-l48Tiq536tnImvqz898iGIG6YfP0Fp8hj2skdNkFv5fTdf4iFC9/g28bMi17JR/aUQZZkg8fm6maZAGNP2BICg==} + dependencies: + crypto-js: 4.1.1 + pinia: 2.0.17_typescript@4.7.2+vue@3.2.36 + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + - vue + dev: false + + /pinia/2.0.17_typescript@4.7.2+vue@3.2.36: + resolution: {integrity: sha512-AtwLwEWQgIjofjgeFT+nxbnK5lT2QwQjaHNEDqpsi2AiCwf/NY78uWTeHUyEhiiJy8+sBmw0ujgQMoQbWiZDfA==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + dependencies: + '@vue/devtools-api': 6.2.1 + typescript: registry.npmmirror.com/typescript/4.7.2 + vue: registry.npmmirror.com/vue/3.2.36 + vue-demi: 0.12.5_vue@3.2.36 + dev: false + /postcss/8.4.14: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} @@ -997,6 +1055,21 @@ packages: vite: registry.npmmirror.com/vite/2.9.9_sass@1.52.1 dev: true + /vue-demi/0.12.5_vue@3.2.36: + resolution: {integrity: sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: registry.npmmirror.com/vue/3.2.36 + dev: false + /webpack-sources/3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} @@ -1625,7 +1698,7 @@ packages: '@vueuse/metadata': registry.npmmirror.com/@vueuse/metadata/8.5.0 '@vueuse/shared': registry.npmmirror.com/@vueuse/shared/8.5.0_vue@3.2.36 vue: registry.npmmirror.com/vue/3.2.36 - vue-demi: registry.npmmirror.com/vue-demi/0.12.5_vue@3.2.36 + vue-demi: 0.12.5_vue@3.2.36 dev: false registry.npmmirror.com/@vueuse/metadata/8.5.0: @@ -1649,7 +1722,7 @@ packages: optional: true dependencies: vue: registry.npmmirror.com/vue/3.2.36 - vue-demi: registry.npmmirror.com/vue-demi/0.12.5_vue@3.2.36 + vue-demi: 0.12.5_vue@3.2.36 dev: false registry.npmmirror.com/acorn-jsx/5.3.2_acorn@8.7.1: @@ -3013,7 +3086,7 @@ packages: engines: {node: '>=8'} dev: true - registry.npmmirror.com/pinia-plugin-persist/1.0.0_pinia@2.0.14+vue@3.2.36: + registry.npmmirror.com/pinia-plugin-persist/1.0.0_pinia@2.0.17+vue@3.2.36: resolution: {integrity: sha512-M4hBBd8fz/GgNmUPaaUsC29y1M09lqbXrMAHcusVoU8xlQi1TqgkWnnhvMikZwr7Le/hVyMx8KUcumGGrR6GVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pinia-plugin-persist/-/pinia-plugin-persist-1.0.0.tgz} id: registry.npmmirror.com/pinia-plugin-persist/1.0.0 name: pinia-plugin-persist @@ -3026,28 +3099,7 @@ packages: '@vue/composition-api': optional: true dependencies: - pinia: registry.npmmirror.com/pinia/2.0.14_typescript@4.7.2+vue@3.2.36 - vue: registry.npmmirror.com/vue/3.2.36 - vue-demi: registry.npmmirror.com/vue-demi/0.12.5_vue@3.2.36 - dev: false - - registry.npmmirror.com/pinia/2.0.14_typescript@4.7.2+vue@3.2.36: - resolution: {integrity: sha512-0nPuZR4TetT/WcLN+feMSjWJku3SQU7dBbXC6uw+R6FLQJCsg+/0pzXyD82T1FmAYe0lsx+jnEDQ1BLgkRKlxA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pinia/-/pinia-2.0.14.tgz} - id: registry.npmmirror.com/pinia/2.0.14 - name: pinia - version: 2.0.14 - peerDependencies: - '@vue/composition-api': ^1.4.0 - typescript: '>=4.4.4' - vue: ^2.6.14 || ^3.2.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - typescript: - optional: true - dependencies: - '@vue/devtools-api': registry.npmmirror.com/@vue/devtools-api/6.1.4 - typescript: registry.npmmirror.com/typescript/4.7.2 + pinia: 2.0.17_typescript@4.7.2+vue@3.2.36 vue: registry.npmmirror.com/vue/3.2.36 vue-demi: registry.npmmirror.com/vue-demi/0.12.5_vue@3.2.36 dev: false diff --git a/public/images/logo.png b/public/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..65e6d2cc173874f62bece4b25c479c950709e29f Binary files /dev/null and b/public/images/logo.png differ diff --git a/src/assets/logo.png b/src/assets/logo.png index f3d2503fc2a44b5053b0837ebea6e87a2d339a43..65e6d2cc173874f62bece4b25c479c950709e29f 100644 Binary files a/src/assets/logo.png and b/src/assets/logo.png differ diff --git a/src/components/QuickCrud/index.vue b/src/components/QuickCrud/index.vue index 43da0533f32fb33fdabe8b1e826fe65ba2eb7dbd..35ac0715a4490bbe70b9c35c7a5ae719ae96ce22 100644 --- a/src/components/QuickCrud/index.vue +++ b/src/components/QuickCrud/index.vue @@ -64,6 +64,11 @@ const props = defineProps({ return [] }, }, + formInline: { + type: Boolean, + default: false, + }, + leftTree: { type: [Boolean, Object], default: false, @@ -113,12 +118,14 @@ const { dialogTitle, formModel, formItems, + formInline, } = toRefs(props) as { searchFormModel: Ref searchFormItems: Ref dialogTitle: Ref formModel: Ref formItems: Ref + formInline: Ref leftTree: Ref leftTreeRefresh: Ref tableData: Ref @@ -288,6 +295,7 @@ const handleAdd = () => { return } Object.keys(formModel.value).forEach((key) => { + formModel.value[key] = '' const index = formItems.value.findIndex( (x) => x.vModel === key && (x.type === 'select' || x.type === 'tree') ) @@ -517,13 +525,16 @@ onActivated(() => { import { defineExpose, defineProps, toRefs, Ref, defineEmits, ref } from 'vue' -import { Plus } from '@element-plus/icons-vue' -import { FormInstance } from 'element-plus' +import { Plus, Setting } from '@element-plus/icons-vue' +import { FormInstance, TabsPaneContext } from 'element-plus' import { FormItem } from '@/types/form' +import elementPlusIcons from '@/config/elementPlusIcon.json' /** * form @@ -24,7 +25,7 @@ const props = defineProps({ return [] }, }, - inline: { + formInline: { type: Boolean, default: false, }, @@ -44,25 +45,35 @@ const props = defineProps({ /** * props toRefs */ -const { - model, - inline = false, - formItems, - formType, - actionSlot = false, - hiddenAction = false, -} = toRefs(props) as { - model: Ref - inline: Ref - formItems: Ref - formType: Ref - actionSlot: Ref - hiddenAction: Ref -} +const { model, formInline, formItems, formType, actionSlot, hiddenAction } = + toRefs(props) as { + model: Ref + formInline: Ref + formItems: Ref + formType: Ref + actionSlot: Ref + hiddenAction: Ref + } + /** * emits */ const emits = defineEmits(['submit', 'clear']) +const iconVisible = ref(false) +/** + * tabs + */ +const activeName = ref('element') +const handleClick = (tab: TabsPaneContext, event: Event) => { + console.log(tab, event) +} +const selectIcon = (item, option) => { + item.select(option.value) + iconVisible.value = false +} +const iconClick = () => { + iconVisible.value = true +} /** * 函数 */ @@ -75,7 +86,7 @@ const handleClear = () => { defineExpose({ handleSubmit }) + diff --git a/src/layout/components/AiniMenuItem/index.vue b/src/layout/components/AiniMenuItem/index.vue index 97673da96627d358753e062f4a0f38721ed1ae7f..d9de45fc69c412a6e30c2b51cdef42cf5ce7d828 100644 --- a/src/layout/components/AiniMenuItem/index.vue +++ b/src/layout/components/AiniMenuItem/index.vue @@ -1,47 +1,69 @@ diff --git a/src/layout/components/AiniSidebar/index.vue b/src/layout/components/AiniSidebar/index.vue index 57f0bae3271153e6688799f81f91c95097ace1c5..5a89099bd0bd113b872c5adab9498e7128d92965 100644 --- a/src/layout/components/AiniSidebar/index.vue +++ b/src/layout/components/AiniSidebar/index.vue @@ -6,7 +6,7 @@ import { Tab } from '@/types/tab' import { Menubar } from '@/types/menu' import AiniMenu from '@/layout/components/AiniMenu/index.vue' -const title = ref('quick后台管理系统') +const title = ref('quick-vue3-admin') const tabStore = useTabStore() const appStore = useAppStore() const isCollapse = computed(() => appStore.getCollapse) @@ -23,6 +23,7 @@ const goHome = () => { enabled: 0, status: 0, path: '/home', + viewPath: '', children: [], } const { id, menuName, path } = menu @@ -64,9 +65,12 @@ const goHome = () => { text-align: center; color: #fff; font-weight: 700; - font-size: 16px; + font-size: 14px; margin: 0; - padding: 0; + padding: 0 10px; + text-overflow: ellipsis; + overflow: hidden; + // white-space: nowrap; } } } diff --git a/src/main.ts b/src/main.ts index 0377ac2e7ddcb5ea3f67c5b55afd387b68a1a0ac..1cce46cd4888f69a6244450ced6896523468abed 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,7 @@ import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import zhCn from 'element-plus/es/locale/lang/zh-cn' import en from 'element-plus/es/locale/lang/en' +import * as Elicons from '@element-plus/icons-vue' import 'quick-vue3-ui/dist/style.css' import * as echarts from 'echarts' import App from './App.vue' @@ -14,12 +15,15 @@ import { useAppStore } from './store/modules/app' const app = createApp(App) const appStore = useAppStore(pinia) -app.use(ElementPlus, { - locale: appStore.getLanguage === 'zh' ? zhCn : en, -}) -app.use(pinia) -app.use(router) -app.use(i18n) app.config.globalProperties.$echarts = echarts - -app.mount('#app') +Object.keys(Elicons).forEach((key) => { + app.component(key, Elicons[key]) +}) +app + .use(ElementPlus, { + locale: appStore.getLanguage === 'zh' ? zhCn : en, + }) + .use(pinia) + .use(router) + .use(i18n) + .mount('#app') diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue index 31e4997bbe0149e8cd6ccf41b0d9c5c98ab712a0..b5137aba83720b70dec7a165ce41729f19de3431 100644 --- a/src/pages/login/index.vue +++ b/src/pages/login/index.vue @@ -1,6 +1,6 @@