diff --git a/components.d.ts b/components.d.ts index dc3bff8..c0bd08d 100644 --- a/components.d.ts +++ b/components.d.ts @@ -51,6 +51,7 @@ declare module 'vue' { ElTimePicker: typeof import('element-plus/es')['ElTimePicker'] ElTimeSelect: typeof import('element-plus/es')['ElTimeSelect'] ElTooltip: typeof import('element-plus/es')['ElTooltip'] + ElTree: typeof import('element-plus/es')['ElTree'] Loading: typeof import('element-plus/es')['ElLoadingDirective'] ParentView: typeof import('./src/components/ParentView/index.vue')['default'] Preview: typeof import('./src/components/Preview/index.vue')['default'] diff --git a/package.json b/package.json index 6a93487..04fdb15 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "highlight.js": "^11.3.1", "intro.js": "^4.2.2", "lodash-es": "^4.17.21", + "mitt": "^3.0.0", "mockjs": "^1.1.0", "nprogress": "^0.2.0", "path-browserify": "^1.0.1", diff --git a/src/hooks/work/useWork.ts b/src/hooks/work/useWork.ts index 631c6af..ba019f7 100644 --- a/src/hooks/work/useWork.ts +++ b/src/hooks/work/useWork.ts @@ -157,7 +157,7 @@ export function useWork(option?: InitOption) { } // 删除多选 - function dels(item: IObj, single: boolean, callback: Fn) { + function dels(item: IObj, single?: boolean, callback?: Fn) { delData( async () => { let ids: Nullable = null @@ -190,7 +190,7 @@ export function useWork(option?: InitOption) { } // 打开弹窗 - function open(row: IObj, component: string, options: DilogOption) { + function open(row: Nullable, component: string, options?: DilogOption) { comName.value = component dialogTitle.value = (options && options.title) || (!row ? '新增' : component === 'Detail' ? '详情' : '编辑') diff --git a/src/mock/role/admin-role.ts b/src/mock/role/admin-role.ts index 51cd251..e3096e8 100644 --- a/src/mock/role/admin-role.ts +++ b/src/mock/role/admin-role.ts @@ -49,19 +49,14 @@ export const checkedNodes = [ title: '弹窗', name: 'DialogDemo' }, - { - path: '/components-demo/more', - title: '显示更多', - name: 'MoreDemo' - }, { path: '/components-demo/detail', - title: '详情组件', + title: '详情', name: 'DetailDemo' }, { path: '/components-demo/qrcode', - title: '二维码组件', + title: '二维码', name: 'QrcodeDemo' }, { @@ -78,31 +73,6 @@ export const checkedNodes = [ path: '/components-demo/watermark', name: 'WatermarkDemo', title: '水印' - }, - { - path: '/components-demo/timer', - name: 'TimerDemo', - title: '计时器' - }, - { - path: '/components-demo/marquee', - name: 'MarqueeDemo', - title: '无缝滚动' - }, - { - path: '/components-demo/water-fall', - name: 'WaterFallDemo', - title: '瀑布流' - }, - { - path: '/components-demo/tree-select', - name: 'TreeSelectDemo', - title: '瀑布流' - }, - { - path: '/components-demo/ellipsis', - name: 'Ellipsis', - title: '省略号' } ] }, @@ -151,19 +121,14 @@ export const checkedNodes = [ title: '弹窗', name: 'DialogDemo' }, - { - path: '/components-demo/more', - title: '显示更多', - name: 'MoreDemo' - }, { path: '/components-demo/detail', - title: '详情组件', + title: '详情', name: 'DetailDemo' }, { path: '/components-demo/qrcode', - title: '二维码组件', + title: '二维码', name: 'QrcodeDemo' }, { @@ -181,31 +146,6 @@ export const checkedNodes = [ name: 'WatermarkDemo', title: '水印' }, - { - path: '/components-demo/timer', - name: 'TimerDemo', - title: '计时器' - }, - { - path: '/components-demo/marquee', - name: 'MarqueeDemo', - title: '无缝滚动' - }, - { - path: '/components-demo/water-fall', - name: 'WaterFallDemo', - title: '瀑布流' - }, - { - path: '/components-demo/tree-select', - name: 'TreeSelectDemo', - title: '瀑布流' - }, - { - path: '/components-demo/ellipsis', - name: 'Ellipsis', - title: '瀑布流' - }, { path: '/table-demo', title: '表格', @@ -430,33 +370,6 @@ export const checkedNodes = [ title: 'Clipboard', name: 'ClipboardDemo' }, - { - path: '/hooks-demo', - title: 'Hooks', - name: 'HooksDemo', - children: [ - { - path: '/hooks-demo/watermark', - title: 'UseWaterMark', - name: 'UseWatermarkDemo' - }, - { - path: '/hooks-demo/useScrollTo', - title: 'UseScrollTo', - name: 'UseScrollToDemo' - } - ] - }, - { - path: '/hooks-demo/watermark', - title: 'UseWaterMark', - name: 'UseWatermarkDemo' - }, - { - path: '/hooks-demo/useScrollTo', - title: 'UseScrollTo', - name: 'UseScrollToDemo' - }, { path: '/icon/index', title: '图标', @@ -563,6 +476,21 @@ export const checkedNodes = [ path: '/example-demo/example-page', title: '列表综合实例-页面', name: 'ExamplePage' + }, + { + path: '/example-demo/example-add', + title: '列表综合实例-新增', + name: 'ExampleAdd' + }, + { + path: '/example-demo/example-edit', + title: '列表综合实例-编辑', + name: 'ExampleEdit' + }, + { + path: '/example-demo/example-detail', + title: '列表综合实例-详情', + name: 'ExampleDetail' } ] }, @@ -576,6 +504,21 @@ export const checkedNodes = [ title: '列表综合实例-页面', name: 'ExamplePage' }, + { + path: '/example-demo/example-add', + title: '列表综合实例-新增', + name: 'ExampleAdd' + }, + { + path: '/example-demo/example-edit', + title: '列表综合实例-编辑', + name: 'ExampleEdit' + }, + { + path: '/example-demo/example-detail', + title: '列表综合实例-详情', + name: 'ExampleDetail' + }, { path: '/role-demo', title: '权限管理', @@ -621,11 +564,6 @@ export const checkedkeys = [ '/components-demo/qrcode', '/components-demo/avatars', '/components-demo/watermark', - '/components-demo/timer', - '/components-demo/marquee', - '/components-demo/water-fall', - '/components-demo/tree-select', - '/components-demo/ellipsis', '/table-demo', '/table-demo/basic-table', '/table-demo/page-table', @@ -649,9 +587,6 @@ export const checkedkeys = [ '/table-demo/custom-index', '/directives-demo', '/directives-demo/clipboard', - '/hooks-demo', - '/hooks-demo/watermark', - '/hooks-demo/useScrollTo', '/icon/index', '/level', '/level/menu1', @@ -662,6 +597,9 @@ export const checkedkeys = [ '/example-demo', '/example-demo/example-dialog', '/example-demo/example-page', + '/example-demo/example-add', + '/example-demo/example-edit', + '/example-demo/example-detail', '/role-demo', '/role-demo/user', '/role-demo/role' diff --git a/src/mock/role/test-role.ts b/src/mock/role/test-role.ts index 19de9cc..30dd081 100644 --- a/src/mock/role/test-role.ts +++ b/src/mock/role/test-role.ts @@ -71,7 +71,7 @@ export const checkedRoleNodes = [ component: 'views/components-demo/detail/index', name: 'DetailDemo', meta: { - title: '详情组件' + title: '详情' } }, { @@ -79,7 +79,7 @@ export const checkedRoleNodes = [ component: 'views/components-demo/qrcode/index', name: 'QrcodeDemo', meta: { - title: '二维码组件' + title: '二维码' } }, { @@ -105,46 +105,6 @@ export const checkedRoleNodes = [ meta: { title: '水印' } - }, - { - path: 'timer', - component: 'views/components-demo/timer/index', - name: 'TimerDemo', - meta: { - title: '计时器' - } - }, - { - path: 'marquee', - component: 'views/components-demo/marquee/index', - name: 'MarqueeDemo', - meta: { - title: '无缝滚动' - } - }, - { - path: 'water-fall', - component: 'views/components-demo/water-fall/index', - name: 'WaterFallDemo', - meta: { - title: '瀑布流' - } - }, - { - path: 'tree-select', - component: 'views/components-demo/tree-select/index', - name: 'TreeSelectDemo', - meta: { - title: '下拉树' - } - }, - { - path: 'ellipsis', - component: 'views/components-demo/ellipsis/index', - name: 'Ellipsis', - meta: { - title: '省略号' - } } ] }, diff --git a/src/router/index.ts b/src/router/index.ts index 7d083f8..8a3ef3c 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -496,104 +496,104 @@ export const asyncRouterMap: AppRouteRecordRaw[] = [ } } ] + }, + { + path: '/example-demo', + component: Layout, + name: 'ExampleDemo', + redirect: '/example-demo/example-dialog', + meta: { + alwaysShow: true, + icon: 'example', + title: '综合实例' + }, + children: [ + { + path: 'example-dialog', + component: () => import('_v/example-demo/example-dialog/index.vue'), + name: 'ExampleDialog', + meta: { + title: '列表综合实例-弹窗' + } + }, + { + path: 'example-page', + component: () => import('_v/example-demo/example-page/index.vue'), + name: 'ExamplePage', + meta: { + title: '列表综合实例-页面' + } + }, + { + path: 'example-add', + component: () => import('_v/example-demo/example-page/example-add.vue'), + name: 'ExampleAdd', + meta: { + title: '列表综合实例-新增', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example-demo/example-page' + } + }, + { + path: 'example-edit', + component: () => import('_v/example-demo/example-page/example-edit.vue'), + name: 'ExampleEdit', + meta: { + title: '列表综合实例-编辑', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example-demo/example-page' + } + }, + { + path: 'example-detail', + component: () => import('_v/example-demo/example-page/example-detail.vue'), + name: 'ExampleDetail', + meta: { + title: '列表综合实例-详情', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example-demo/example-page' + } + } + ] + }, + { + path: '/role-demo', + component: Layout, + redirect: '/role-demo/user', + name: 'RoleDemo', + meta: { + title: '权限管理', + icon: 'user', + alwaysShow: true + }, + children: [ + { + path: 'user', + component: () => import('_v/role-demo/user/index.vue'), + name: 'User', + meta: { + title: '用户管理' + } + }, + { + path: 'role', + component: () => import('_v/role-demo/role/index.vue'), + name: 'Role', + meta: { + title: '角色管理' + } + } + ] } - // { - // path: '/example-demo', - // component: Layout, - // name: 'ExampleDemo', - // redirect: '/example-demo/example-dialog', - // meta: { - // alwaysShow: true, - // icon: 'example', - // title: '综合实例' - // }, - // children: [ - // { - // path: 'example-dialog', - // component: () => import('_v/example-demo/example-dialog/index.vue'), - // name: 'ExampleDialog', - // meta: { - // title: '列表综合实例-弹窗' - // } - // }, - // { - // path: 'example-page', - // component: () => import('_v/example-demo/example-page/index.vue'), - // name: 'ExamplePage', - // meta: { - // title: '列表综合实例-页面' - // } - // }, - // { - // path: 'example-add', - // component: () => import('_v/example-demo/example-page/example-add.vue'), - // name: 'ExampleAdd', - // meta: { - // title: '列表综合实例-新增', - // noTagsView: true, - // noCache: true, - // hidden: true, - // showMainRoute: true, - // activeMenu: '/example-demo/example-page' - // } - // }, - // { - // path: 'example-edit', - // component: () => import('_v/example-demo/example-page/example-edit.vue'), - // name: 'ExampleEdit', - // meta: { - // title: '列表综合实例-编辑', - // noTagsView: true, - // noCache: true, - // hidden: true, - // showMainRoute: true, - // activeMenu: '/example-demo/example-page' - // } - // }, - // { - // path: 'example-detail', - // component: () => import('_v/example-demo/example-page/example-detail.vue'), - // name: 'ExampleDetail', - // meta: { - // title: '列表综合实例-详情', - // noTagsView: true, - // noCache: true, - // hidden: true, - // showMainRoute: true, - // activeMenu: '/example-demo/example-page' - // } - // } - // ] - // }, - // { - // path: '/role-demo', - // component: Layout, - // redirect: '/role-demo/user', - // name: 'RoleDemo', - // meta: { - // title: '权限管理', - // icon: 'user', - // alwaysShow: true - // }, - // children: [ - // { - // path: 'user', - // component: () => import('_v/role-demo/user/index.vue'), - // name: 'User', - // meta: { - // title: '用户管理' - // } - // }, - // { - // path: 'role', - // component: () => import('_v/role-demo/role/index.vue'), - // name: 'Role', - // meta: { - // title: '角色管理' - // } - // } - // ] - // } ] const router = createRouter({ diff --git a/src/router/types.ts b/src/router/types.ts index 23a743c..9a6d898 100644 --- a/src/router/types.ts +++ b/src/router/types.ts @@ -17,5 +17,6 @@ export interface RouteMeta { // @ts-ignore export interface AppRouteRecordRaw extends Omit { meta: RouteMeta + title?: string children?: AppRouteRecordRaw[] } diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index 6b9d8ea..562c317 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -12,7 +12,8 @@ import { store } from '../index' import { useAppStoreWithOut } from '@/store/modules/app' const appStore = useAppStoreWithOut() -const modules = import.meta.glob('./src/views/*/*.vue') +const modules = import.meta.glob('../../views/**/*.vue') +console.log(modules) /* Layout */ const Layout = () => import('@/layout/index.vue') @@ -100,6 +101,7 @@ function generateRoutesFn(routes: AppRouteRecordRaw[], basePath = '/'): AppRoute for (const route of routes) { // skip some route if (route.meta && route.meta.hidden && !route.meta.showMainRoute) { + console.log(route) continue } @@ -162,7 +164,7 @@ function getFilterRoutes(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[] { ? Layout : (route.component as any).includes('##') ? getParentLayout((route.component as any).split('##')[1]) - : modules[`@/${route.component}.vue`] + : modules[`../../${route.component}.vue`] ) as any } // recursive child routes diff --git a/src/views/example-demo/example-dialog/api.ts b/src/views/example-demo/example-dialog/api.ts new file mode 100644 index 0000000..6863375 --- /dev/null +++ b/src/views/example-demo/example-dialog/api.ts @@ -0,0 +1,17 @@ +import fetch from '@/axios-config' + +export const getExampleListApi = ({ params }: any) => { + return fetch({ url: '/example/list', method: 'get', params }) +} + +export const delsExampApi = ({ data }: any) => { + return fetch({ url: '/example/delete', method: 'post', data }) +} + +export const setExampApi = ({ data }: any) => { + return fetch({ url: '/example/save', method: 'post', data }) +} + +export const getExampDetApi = ({ params }: any) => { + return fetch({ url: '/example/detail', method: 'get', params }) +} diff --git a/src/views/example-demo/example-dialog/components/Detail.vue b/src/views/example-demo/example-dialog/components/Detail.vue new file mode 100644 index 0000000..85e1291 --- /dev/null +++ b/src/views/example-demo/example-dialog/components/Detail.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/views/example-demo/example-dialog/components/InfoWrite.vue b/src/views/example-demo/example-dialog/components/InfoWrite.vue new file mode 100644 index 0000000..8f047e9 --- /dev/null +++ b/src/views/example-demo/example-dialog/components/InfoWrite.vue @@ -0,0 +1,158 @@ + + + diff --git a/src/views/example-demo/example-dialog/components/types.ts b/src/views/example-demo/example-dialog/components/types.ts new file mode 100644 index 0000000..2e5d6bb --- /dev/null +++ b/src/views/example-demo/example-dialog/components/types.ts @@ -0,0 +1,18 @@ +export interface InfoWriteParams { + title: string + id?: string + author: string + content: string + importance: string + display_time: string + pageviews: number +} + +export interface InfoWriteRules { + title?: any[] + author?: any[] + content?: any[] + importance?: any[] + display_time?: any[] + pageviews?: any[] +} diff --git a/src/views/example-demo/example-dialog/index.vue b/src/views/example-demo/example-dialog/index.vue new file mode 100644 index 0000000..0e58fe9 --- /dev/null +++ b/src/views/example-demo/example-dialog/index.vue @@ -0,0 +1,135 @@ + + + diff --git a/src/views/example-demo/example-page/api.ts b/src/views/example-demo/example-page/api.ts new file mode 100644 index 0000000..e3b5b2a --- /dev/null +++ b/src/views/example-demo/example-page/api.ts @@ -0,0 +1,17 @@ +import fetch from '@/axios-config' + +export const getExampleListApi = ({ params }: any) => { + return fetch({ url: '/example/list2', method: 'get', params }) +} + +export const delsExampApi = ({ data }: any) => { + return fetch({ url: '/example/delete', method: 'post', data }) +} + +export const setExampApi = ({ data }: any) => { + return fetch({ url: '/example/save', method: 'post', data }) +} + +export const getExampDetApi = ({ params }: any) => { + return fetch({ url: '/example/detail', method: 'get', params }) +} diff --git a/src/views/example-demo/example-page/components/Detail.vue b/src/views/example-demo/example-page/components/Detail.vue new file mode 100644 index 0000000..9697da7 --- /dev/null +++ b/src/views/example-demo/example-page/components/Detail.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/views/example-demo/example-page/components/InfoWrite.vue b/src/views/example-demo/example-page/components/InfoWrite.vue new file mode 100644 index 0000000..dd4819f --- /dev/null +++ b/src/views/example-demo/example-page/components/InfoWrite.vue @@ -0,0 +1,160 @@ + + + diff --git a/src/views/example-demo/example-page/components/types.ts b/src/views/example-demo/example-page/components/types.ts new file mode 100644 index 0000000..2e5d6bb --- /dev/null +++ b/src/views/example-demo/example-page/components/types.ts @@ -0,0 +1,18 @@ +export interface InfoWriteParams { + title: string + id?: string + author: string + content: string + importance: string + display_time: string + pageviews: number +} + +export interface InfoWriteRules { + title?: any[] + author?: any[] + content?: any[] + importance?: any[] + display_time?: any[] + pageviews?: any[] +} diff --git a/src/views/example-demo/example-page/example-add.vue b/src/views/example-demo/example-page/example-add.vue new file mode 100644 index 0000000..915c116 --- /dev/null +++ b/src/views/example-demo/example-page/example-add.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/views/example-demo/example-page/example-detail.vue b/src/views/example-demo/example-page/example-detail.vue new file mode 100644 index 0000000..ff27c29 --- /dev/null +++ b/src/views/example-demo/example-page/example-detail.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/views/example-demo/example-page/example-edit.vue b/src/views/example-demo/example-page/example-edit.vue new file mode 100644 index 0000000..814894a --- /dev/null +++ b/src/views/example-demo/example-page/example-edit.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/views/example-demo/example-page/index.vue b/src/views/example-demo/example-page/index.vue new file mode 100644 index 0000000..aeb3547 --- /dev/null +++ b/src/views/example-demo/example-page/index.vue @@ -0,0 +1,139 @@ + + + diff --git a/src/views/role-demo/role/api.ts b/src/views/role-demo/role/api.ts new file mode 100644 index 0000000..c9b6c1c --- /dev/null +++ b/src/views/role-demo/role/api.ts @@ -0,0 +1,13 @@ +import fetch from '@/axios-config' + +export const getRoleListApi = ({ params }: any) => { + return fetch({ url: '/role/list', method: 'get', params }) +} + +export const setRoleApi = ({ data }: any) => { + return fetch({ url: '/role/save', method: 'post', data }) +} + +export const getRoleDetApi = ({ params }: any) => { + return fetch({ url: '/role/detail', method: 'get', params }) +} diff --git a/src/views/role-demo/role/components/InfoWrite.vue b/src/views/role-demo/role/components/InfoWrite.vue new file mode 100644 index 0000000..88d175b --- /dev/null +++ b/src/views/role-demo/role/components/InfoWrite.vue @@ -0,0 +1,201 @@ + + + diff --git a/src/views/role-demo/role/components/InfoWrite2.vue b/src/views/role-demo/role/components/InfoWrite2.vue new file mode 100644 index 0000000..e93e08d --- /dev/null +++ b/src/views/role-demo/role/components/InfoWrite2.vue @@ -0,0 +1,225 @@ + + + diff --git a/src/views/role-demo/role/index.vue b/src/views/role-demo/role/index.vue new file mode 100644 index 0000000..5935234 --- /dev/null +++ b/src/views/role-demo/role/index.vue @@ -0,0 +1,124 @@ + + + diff --git a/src/views/role-demo/user/api.ts b/src/views/role-demo/user/api.ts new file mode 100644 index 0000000..c9340a8 --- /dev/null +++ b/src/views/role-demo/user/api.ts @@ -0,0 +1,5 @@ +import fetch from '@/axios-config' + +export const getUserListApi = ({ params }: any) => { + return fetch({ url: '/user/list', method: 'get', params }) +} diff --git a/src/views/role-demo/user/index.vue b/src/views/role-demo/user/index.vue new file mode 100644 index 0000000..2e20de5 --- /dev/null +++ b/src/views/role-demo/user/index.vue @@ -0,0 +1,90 @@ + + + diff --git a/src/vue-bus/index.ts b/src/vue-bus/index.ts new file mode 100644 index 0000000..cb8b25b --- /dev/null +++ b/src/vue-bus/index.ts @@ -0,0 +1,13 @@ +// 通过mitt实现vue-bus通信 + +import mitt from 'mitt' + +const bus: any = {} + +const emitter = mitt() + +bus.$on = emitter.on +bus.$off = emitter.off +bus.$emit = emitter.emit + +export default bus diff --git a/yarn.lock b/yarn.lock index f407cac..c8a202e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5115,6 +5115,11 @@ minimist@1.2.5, minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +mitt@^3.0.0: + version "3.0.0" + resolved "https://registry.nlark.com/mitt/download/mitt-3.0.0.tgz?cache=0&sync_timestamp=1624481394885&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmitt%2Fdownload%2Fmitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" + integrity sha1-ae+b1cgP9vV0c+jYkybQHEFL4L0= + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.nlark.com/mixin-deep/download/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"