├── src ├── views │ ├── other │ │ ├── cropper │ │ │ ├── index.scss │ │ │ └── index.vue │ │ ├── fullScreen │ │ │ └── index.vue │ │ ├── textClamp │ │ │ ├── index.scss │ │ │ └── index.vue │ │ ├── svgIcon │ │ │ ├── index.scss │ │ │ └── index.vue │ │ ├── iconfont │ │ │ ├── index.scss │ │ │ └── index.vue │ │ ├── count │ │ │ └── index.scss │ │ ├── cardDrag │ │ │ ├── data.ts │ │ │ ├── index.scss │ │ │ └── index.vue │ │ ├── codeMirror │ │ │ └── index.vue │ │ ├── clipboard │ │ │ └── index.vue │ │ ├── markDown │ │ │ └── index.vue │ │ └── rightMenu │ │ │ └── index.vue │ ├── excel │ │ ├── exportSelectedExcel │ │ │ └── index.vue │ │ └── exportExcel │ │ │ ├── index.scss │ │ │ └── index.vue │ ├── form │ │ ├── searchForm │ │ │ ├── index.scss │ │ │ └── index.vue │ │ ├── advancedForm │ │ │ └── index.scss │ │ ├── appendForm │ │ │ └── index.scss │ │ ├── moreForm │ │ │ ├── index.scss │ │ │ ├── index.vue │ │ │ └── components │ │ │ │ ├── FormThree.vue │ │ │ │ ├── FormTwo.vue │ │ │ │ └── FormOne.vue │ │ └── validateForm │ │ │ └── components │ │ │ └── Upload.vue │ ├── externalLinks │ │ ├── simple │ │ │ └── index.vue │ │ ├── wechat │ │ │ └── index.vue │ │ └── iframe │ │ │ └── index.vue │ ├── nested │ │ ├── menu1 │ │ │ ├── menu1-3 │ │ │ │ └── index.vue │ │ │ ├── menu1-2 │ │ │ │ ├── menu1-2-1 │ │ │ │ │ └── index.vue │ │ │ │ ├── menu1-2-2 │ │ │ │ │ └── index.vue │ │ │ │ └── index.vue │ │ │ ├── menu1-1 │ │ │ │ └── index.vue │ │ │ └── index.vue │ │ └── menu2 │ │ │ └── index.vue │ ├── system │ │ ├── user │ │ │ ├── index.vue │ │ │ └── components │ │ │ │ └── userSide.vue │ │ ├── dictionary │ │ │ └── index.vue │ │ └── dept │ │ │ └── index.scss │ ├── chat │ │ ├── components │ │ │ └── u-chartBox │ │ │ │ └── chat.js │ │ └── index.vue │ ├── echarts │ │ ├── migrationMap │ │ │ ├── index.scss │ │ │ └── index.vue │ │ └── simple │ │ │ └── components │ │ │ ├── gauge.vue │ │ │ ├── bar.vue │ │ │ ├── candlestick.vue │ │ │ ├── line.vue │ │ │ ├── scatter.vue │ │ │ ├── pie.vue │ │ │ └── graph.vue │ ├── login │ │ ├── components │ │ │ └── LoginQrcode.vue │ │ └── index.vue │ ├── functionPage │ │ ├── informationList │ │ │ ├── index.vue │ │ │ └── components │ │ │ │ ├── Search.vue │ │ │ │ ├── Pagination.vue │ │ │ │ └── SingleCheck.vue │ │ └── fullscreen │ │ │ ├── index.scss │ │ │ └── index.vue │ ├── home │ │ └── index.scss │ ├── dataScreen │ │ └── components │ │ │ └── full-screen-container.vue │ └── table │ │ └── ComprehensiveTable │ │ └── constants.tsx ├── config │ └── index.ts ├── assets │ ├── image │ │ ├── we.png │ │ ├── allow.png │ │ ├── avatar.png │ │ ├── logo.png │ │ ├── berserk.jpg │ │ ├── circle-bg.png │ │ ├── cro-avatar.jpg │ │ ├── center-inner1.png │ │ ├── charts │ │ │ └── 1-1-bg.png │ │ └── login │ │ │ ├── side-logo.png │ │ │ └── qrcode-icon.png │ ├── 403_images │ │ ├── 403.png │ │ └── 403_cloud.png │ ├── 404_images │ │ ├── 404.png │ │ ├── 404_bg.png │ │ └── 404_cloud.png │ └── iconfont │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ ├── iconfont.woff2 │ │ └── iconfont.css ├── styles │ ├── index.scss │ ├── element.scss │ ├── variables.scss │ └── transition.scss ├── components │ ├── CountTo │ │ ├── index.js │ │ └── requestAnimationFrame.js │ ├── pipeline │ │ └── index.vue │ ├── PageWrapLayout │ │ ├── index.vue │ │ └── index.scss │ ├── u-container-layout │ │ └── index.vue │ ├── SwitchDark │ │ └── index.vue │ ├── DataScreen │ │ └── migrationEcharts │ │ │ └── data.js │ ├── SvgIcon │ │ └── index.vue │ ├── SearchForm │ │ └── components │ │ │ └── BaseFormItem.vue │ └── WangEdior │ │ └── index.vue ├── api │ ├── user.ts │ ├── errorCodeType.ts │ └── request.ts ├── icons │ ├── svg │ │ ├── size.svg │ │ ├── link.svg │ │ ├── fullscreen.svg │ │ ├── user.svg │ │ ├── example.svg │ │ ├── table.svg │ │ ├── password.svg │ │ ├── report-form.svg │ │ ├── task.svg │ │ ├── nested.svg │ │ ├── compass.svg │ │ ├── horn.svg │ │ ├── eye.svg │ │ ├── todo.svg │ │ ├── entrust.svg │ │ ├── eye-open.svg │ │ ├── go-out.svg │ │ ├── put-in.svg │ │ ├── home.svg │ │ ├── notice.svg │ │ ├── exit-fullscreen.svg │ │ ├── tree.svg │ │ ├── update.svg │ │ ├── take-over.svg │ │ └── dashboard.svg │ ├── svgo.yml │ └── index.js ├── vite-env.d.ts ├── utils │ ├── auth.ts │ ├── element.ts │ ├── emojis.ts │ ├── requestAnimationFrameThrottle.js │ ├── clipboard.ts │ ├── routers.ts │ └── resize.js ├── routers │ └── modules │ │ ├── dataScreen.ts │ │ ├── chat.ts │ │ ├── table.ts │ │ ├── externalLink.ts │ │ ├── system.ts │ │ ├── excel.ts │ │ ├── form.ts │ │ ├── echarts.ts │ │ └── functionPage.ts ├── layout │ ├── components │ │ ├── Header │ │ │ ├── components │ │ │ │ ├── Height.vue │ │ │ │ ├── ScreenFull.vue │ │ │ │ ├── CollapseIcon.vue │ │ │ │ ├── Setting.vue │ │ │ │ ├── Hamburger.vue │ │ │ │ └── globalComSize.vue │ │ │ ├── ToolLeft.vue │ │ │ └── ToolRight.vue │ │ ├── Footer │ │ │ └── index.vue │ │ ├── Mobile │ │ │ └── index.vue │ │ ├── SubMenu │ │ │ ├── MenuItem.vue │ │ │ ├── Link.vue │ │ │ └── SubMenu.vue │ │ ├── Main │ │ │ └── index.vue │ │ ├── Sidebar │ │ │ ├── components │ │ │ │ └── Logo.vue │ │ │ └── index.vue │ │ └── TagsView │ │ │ └── components │ │ │ └── MoreButton.vue │ ├── LayoutHorizontal │ │ ├── index.vue │ │ └── HeaderHorizontal │ │ │ ├── index.scss │ │ │ └── index.vue │ └── LayoutVertical │ │ ├── index.vue │ │ └── HeaderVertical │ │ ├── index.vue │ │ └── index.scss ├── plugins │ └── ElIcons.ts ├── store │ ├── index.ts │ └── modules │ │ ├── user.ts │ │ ├── permission.ts │ │ └── setting.ts ├── hooks │ ├── useWrapComponents.ts │ ├── useResizeElement.ts │ └── useResizeHandler.ts ├── App.vue ├── main.ts └── permission.ts ├── .env ├── .husky └── pre-commit ├── public ├── favicon.ico ├── static │ ├── face │ │ ├── 刀.png │ │ ├── 吐.png │ │ ├── 吓.png │ │ ├── 嘘.png │ │ ├── 困.png │ │ ├── 弱.png │ │ ├── 强.png │ │ ├── 晕.png │ │ ├── 睡.png │ │ ├── 耶.png │ │ ├── 色.png │ │ ├── 衰.png │ │ ├── 酷.png │ │ ├── 饭.png │ │ ├── 鸡.png │ │ ├── NO.png │ │ ├── OK.png │ │ ├── 乒乓.png │ │ ├── 乱舞.png │ │ ├── 亲亲.png │ │ ├── 便便.png │ │ ├── 偷笑.png │ │ ├── 傲慢.png │ │ ├── 再见.png │ │ ├── 冷汗.png │ │ ├── 凋谢.png │ │ ├── 勾引.png │ │ ├── 发呆.png │ │ ├── 发怒.png │ │ ├── 发抖.png │ │ ├── 可怜.png │ │ ├── 右哼哼.png │ │ ├── 右太极.png │ │ ├── 呲牙.png │ │ ├── 咒骂.png │ │ ├── 咖啡.png │ │ ├── 哈欠.png │ │ ├── 啤酒.png │ │ ├── 嘴唇.png │ │ ├── 嘿哈.png │ │ ├── 回头.png │ │ ├── 坏笑.png │ │ ├── 大哭.png │ │ ├── 太阳.png │ │ ├── 奋斗.png │ │ ├── 奸笑.png │ │ ├── 委屈.png │ │ ├── 害羞.png │ │ ├── 尴尬.png │ │ ├── 左哼哼.png │ │ ├── 左太极.png │ │ ├── 差劲.png │ │ ├── 得意.png │ │ ├── 微笑.png │ │ ├── 心碎.png │ │ ├── 快哭了.png │ │ ├── 怄火.png │ │ ├── 悠闲.png │ │ ├── 惊恐.png │ │ ├── 惊讶.png │ │ ├── 愉快.png │ │ ├── 憨笑.png │ │ ├── 抓狂.png │ │ ├── 投降.png │ │ ├── 抠鼻.png │ │ ├── 抱拳.png │ │ ├── 拥抱.png │ │ ├── 拳头.png │ │ ├── 捂脸.png │ │ ├── 握手.png │ │ ├── 撇嘴.png │ │ ├── 擦汗.png │ │ ├── 敲打.png │ │ ├── 月亮.png │ │ ├── 机智.png │ │ ├── 流汗.png │ │ ├── 流泪.png │ │ ├── 激动.png │ │ ├── 炸弹.png │ │ ├── 爱你.png │ │ ├── 爱心.png │ │ ├── 爱情.png │ │ ├── 猪头.png │ │ ├── 献吻.png │ │ ├── 玫瑰.png │ │ ├── 瓢虫.png │ │ ├── 疑问.png │ │ ├── 疯了.png │ │ ├── 白眼.png │ │ ├── 皱眉.png │ │ ├── 磕头.png │ │ ├── 礼物.png │ │ ├── 篮球.png │ │ ├── 糗大了.png │ │ ├── 红包.png │ │ ├── 胜利.png │ │ ├── 菜刀.png │ │ ├── 蛋糕.png │ │ ├── 西瓜.png │ │ ├── 调皮.png │ │ ├── 足球.png │ │ ├── 跳绳.png │ │ ├── 跳跳.png │ │ ├── 转圈.png │ │ ├── 鄙视.png │ │ ├── 闪电.png │ │ ├── 闭嘴.png │ │ ├── 阴险.png │ │ ├── 难过.png │ │ ├── 飞吻.png │ │ ├── 饥饿.png │ │ ├── 骷髅.png │ │ ├── 鼓掌.png │ │ ├── emoji-after.png │ │ └── emoji-before.png │ └── screen │ │ ├── bg.jpg │ │ ├── bg.png │ │ ├── footer2.png │ │ ├── header-bg.png │ │ └── server-bg.png └── index.html ├── .env.test ├── .env.development ├── .env.production ├── .prettierignore ├── .eslintignore ├── tsconfig.node.json ├── .gitignore ├── .prettierrc.js └── tsconfig.json /src/views/other/cropper/index.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/other/fullScreen/index.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/other/textClamp/index.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/excel/exportSelectedExcel/index.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | 2 | # port 3 | VITE_PORT = 8100 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/config/index.ts: -------------------------------------------------------------------------------- 1 | // * 默认主题颜色 2 | export const PRIMARY_COLOR = '#409eff' 3 | -------------------------------------------------------------------------------- /src/views/form/searchForm/index.scss: -------------------------------------------------------------------------------- 1 | .searchdForm { 2 | padding: 20px; 3 | } 4 | -------------------------------------------------------------------------------- /src/views/form/advancedForm/index.scss: -------------------------------------------------------------------------------- 1 | .advancedForm { 2 | padding: 20px; 3 | } 4 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | # 测试环境 2 | NODE_ENV = "test" 3 | 4 | 5 | # 测试环境接口地址 6 | VITE_APP_BASE_API = '/api' 7 | -------------------------------------------------------------------------------- /public/static/face/刀.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/刀.png -------------------------------------------------------------------------------- /public/static/face/吐.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/吐.png -------------------------------------------------------------------------------- /public/static/face/吓.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/吓.png -------------------------------------------------------------------------------- /public/static/face/嘘.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/嘘.png -------------------------------------------------------------------------------- /public/static/face/困.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/困.png -------------------------------------------------------------------------------- /public/static/face/弱.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/弱.png -------------------------------------------------------------------------------- /public/static/face/强.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/强.png -------------------------------------------------------------------------------- /public/static/face/晕.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/晕.png -------------------------------------------------------------------------------- /public/static/face/睡.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/睡.png -------------------------------------------------------------------------------- /public/static/face/耶.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/耶.png -------------------------------------------------------------------------------- /public/static/face/色.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/色.png -------------------------------------------------------------------------------- /public/static/face/衰.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/衰.png -------------------------------------------------------------------------------- /public/static/face/酷.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/酷.png -------------------------------------------------------------------------------- /public/static/face/饭.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/饭.png -------------------------------------------------------------------------------- /public/static/face/鸡.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/鸡.png -------------------------------------------------------------------------------- /src/assets/image/we.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/we.png -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | # 本地环境 2 | NODE_ENV = 'development' 3 | 4 | # 本地环境接口地址 5 | VITE_APP_BASE_API = '/api' 6 | -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | # 线上环境 2 | NODE_ENV = "production" 3 | 4 | # 线上环境接口地址 5 | VITE_APP_BASE_API = '/api' 6 | -------------------------------------------------------------------------------- /public/static/face/NO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/NO.png -------------------------------------------------------------------------------- /public/static/face/OK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/OK.png -------------------------------------------------------------------------------- /public/static/face/乒乓.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/乒乓.png -------------------------------------------------------------------------------- /public/static/face/乱舞.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/乱舞.png -------------------------------------------------------------------------------- /public/static/face/亲亲.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/亲亲.png -------------------------------------------------------------------------------- /public/static/face/便便.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/便便.png -------------------------------------------------------------------------------- /public/static/face/偷笑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/偷笑.png -------------------------------------------------------------------------------- /public/static/face/傲慢.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/傲慢.png -------------------------------------------------------------------------------- /public/static/face/再见.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/再见.png -------------------------------------------------------------------------------- /public/static/face/冷汗.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/冷汗.png -------------------------------------------------------------------------------- /public/static/face/凋谢.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/凋谢.png -------------------------------------------------------------------------------- /public/static/face/勾引.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/勾引.png -------------------------------------------------------------------------------- /public/static/face/发呆.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/发呆.png -------------------------------------------------------------------------------- /public/static/face/发怒.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/发怒.png -------------------------------------------------------------------------------- /public/static/face/发抖.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/发抖.png -------------------------------------------------------------------------------- /public/static/face/可怜.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/可怜.png -------------------------------------------------------------------------------- /public/static/face/右哼哼.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/右哼哼.png -------------------------------------------------------------------------------- /public/static/face/右太极.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/右太极.png -------------------------------------------------------------------------------- /public/static/face/呲牙.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/呲牙.png -------------------------------------------------------------------------------- /public/static/face/咒骂.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/咒骂.png -------------------------------------------------------------------------------- /public/static/face/咖啡.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/咖啡.png -------------------------------------------------------------------------------- /public/static/face/哈欠.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/哈欠.png -------------------------------------------------------------------------------- /public/static/face/啤酒.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/啤酒.png -------------------------------------------------------------------------------- /public/static/face/嘴唇.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/嘴唇.png -------------------------------------------------------------------------------- /public/static/face/嘿哈.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/嘿哈.png -------------------------------------------------------------------------------- /public/static/face/回头.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/回头.png -------------------------------------------------------------------------------- /public/static/face/坏笑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/坏笑.png -------------------------------------------------------------------------------- /public/static/face/大哭.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/大哭.png -------------------------------------------------------------------------------- /public/static/face/太阳.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/太阳.png -------------------------------------------------------------------------------- /public/static/face/奋斗.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/奋斗.png -------------------------------------------------------------------------------- /public/static/face/奸笑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/奸笑.png -------------------------------------------------------------------------------- /public/static/face/委屈.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/委屈.png -------------------------------------------------------------------------------- /public/static/face/害羞.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/害羞.png -------------------------------------------------------------------------------- /public/static/face/尴尬.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/尴尬.png -------------------------------------------------------------------------------- /public/static/face/左哼哼.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/左哼哼.png -------------------------------------------------------------------------------- /public/static/face/左太极.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/左太极.png -------------------------------------------------------------------------------- /public/static/face/差劲.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/差劲.png -------------------------------------------------------------------------------- /public/static/face/得意.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/得意.png -------------------------------------------------------------------------------- /public/static/face/微笑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/微笑.png -------------------------------------------------------------------------------- /public/static/face/心碎.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/心碎.png -------------------------------------------------------------------------------- /public/static/face/快哭了.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/快哭了.png -------------------------------------------------------------------------------- /public/static/face/怄火.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/怄火.png -------------------------------------------------------------------------------- /public/static/face/悠闲.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/悠闲.png -------------------------------------------------------------------------------- /public/static/face/惊恐.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/惊恐.png -------------------------------------------------------------------------------- /public/static/face/惊讶.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/惊讶.png -------------------------------------------------------------------------------- /public/static/face/愉快.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/愉快.png -------------------------------------------------------------------------------- /public/static/face/憨笑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/憨笑.png -------------------------------------------------------------------------------- /public/static/face/抓狂.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/抓狂.png -------------------------------------------------------------------------------- /public/static/face/投降.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/投降.png -------------------------------------------------------------------------------- /public/static/face/抠鼻.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/抠鼻.png -------------------------------------------------------------------------------- /public/static/face/抱拳.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/抱拳.png -------------------------------------------------------------------------------- /public/static/face/拥抱.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/拥抱.png -------------------------------------------------------------------------------- /public/static/face/拳头.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/拳头.png -------------------------------------------------------------------------------- /public/static/face/捂脸.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/捂脸.png -------------------------------------------------------------------------------- /public/static/face/握手.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/握手.png -------------------------------------------------------------------------------- /public/static/face/撇嘴.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/撇嘴.png -------------------------------------------------------------------------------- /public/static/face/擦汗.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/擦汗.png -------------------------------------------------------------------------------- /public/static/face/敲打.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/敲打.png -------------------------------------------------------------------------------- /public/static/face/月亮.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/月亮.png -------------------------------------------------------------------------------- /public/static/face/机智.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/机智.png -------------------------------------------------------------------------------- /public/static/face/流汗.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/流汗.png -------------------------------------------------------------------------------- /public/static/face/流泪.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/流泪.png -------------------------------------------------------------------------------- /public/static/face/激动.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/激动.png -------------------------------------------------------------------------------- /public/static/face/炸弹.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/炸弹.png -------------------------------------------------------------------------------- /public/static/face/爱你.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/爱你.png -------------------------------------------------------------------------------- /public/static/face/爱心.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/爱心.png -------------------------------------------------------------------------------- /public/static/face/爱情.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/爱情.png -------------------------------------------------------------------------------- /public/static/face/猪头.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/猪头.png -------------------------------------------------------------------------------- /public/static/face/献吻.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/献吻.png -------------------------------------------------------------------------------- /public/static/face/玫瑰.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/玫瑰.png -------------------------------------------------------------------------------- /public/static/face/瓢虫.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/瓢虫.png -------------------------------------------------------------------------------- /public/static/face/疑问.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/疑问.png -------------------------------------------------------------------------------- /public/static/face/疯了.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/疯了.png -------------------------------------------------------------------------------- /public/static/face/白眼.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/白眼.png -------------------------------------------------------------------------------- /public/static/face/皱眉.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/皱眉.png -------------------------------------------------------------------------------- /public/static/face/磕头.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/磕头.png -------------------------------------------------------------------------------- /public/static/face/礼物.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/礼物.png -------------------------------------------------------------------------------- /public/static/face/篮球.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/篮球.png -------------------------------------------------------------------------------- /public/static/face/糗大了.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/糗大了.png -------------------------------------------------------------------------------- /public/static/face/红包.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/红包.png -------------------------------------------------------------------------------- /public/static/face/胜利.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/胜利.png -------------------------------------------------------------------------------- /public/static/face/菜刀.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/菜刀.png -------------------------------------------------------------------------------- /public/static/face/蛋糕.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/蛋糕.png -------------------------------------------------------------------------------- /public/static/face/西瓜.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/西瓜.png -------------------------------------------------------------------------------- /public/static/face/调皮.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/调皮.png -------------------------------------------------------------------------------- /public/static/face/足球.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/足球.png -------------------------------------------------------------------------------- /public/static/face/跳绳.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/跳绳.png -------------------------------------------------------------------------------- /public/static/face/跳跳.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/跳跳.png -------------------------------------------------------------------------------- /public/static/face/转圈.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/转圈.png -------------------------------------------------------------------------------- /public/static/face/鄙视.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/鄙视.png -------------------------------------------------------------------------------- /public/static/face/闪电.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/闪电.png -------------------------------------------------------------------------------- /public/static/face/闭嘴.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/闭嘴.png -------------------------------------------------------------------------------- /public/static/face/阴险.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/阴险.png -------------------------------------------------------------------------------- /public/static/face/难过.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/难过.png -------------------------------------------------------------------------------- /public/static/face/飞吻.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/飞吻.png -------------------------------------------------------------------------------- /public/static/face/饥饿.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/饥饿.png -------------------------------------------------------------------------------- /public/static/face/骷髅.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/骷髅.png -------------------------------------------------------------------------------- /public/static/face/鼓掌.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/鼓掌.png -------------------------------------------------------------------------------- /public/static/screen/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/screen/bg.jpg -------------------------------------------------------------------------------- /public/static/screen/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/screen/bg.png -------------------------------------------------------------------------------- /src/assets/image/allow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/allow.png -------------------------------------------------------------------------------- /src/assets/image/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/avatar.png -------------------------------------------------------------------------------- /src/assets/image/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/logo.png -------------------------------------------------------------------------------- /src/assets/403_images/403.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/403_images/403.png -------------------------------------------------------------------------------- /src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/404_images/404.png -------------------------------------------------------------------------------- /src/assets/image/berserk.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/berserk.jpg -------------------------------------------------------------------------------- /public/static/screen/footer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/screen/footer2.png -------------------------------------------------------------------------------- /src/assets/404_images/404_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/404_images/404_bg.png -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /src/assets/image/circle-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/circle-bg.png -------------------------------------------------------------------------------- /src/assets/image/cro-avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/cro-avatar.jpg -------------------------------------------------------------------------------- /public/static/face/emoji-after.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/emoji-after.png -------------------------------------------------------------------------------- /public/static/screen/header-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/screen/header-bg.png -------------------------------------------------------------------------------- /public/static/screen/server-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/screen/server-bg.png -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/iconfont/iconfont.woff -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/iconfont/iconfont.woff2 -------------------------------------------------------------------------------- /src/assets/image/center-inner1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/center-inner1.png -------------------------------------------------------------------------------- /src/assets/image/charts/1-1-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/charts/1-1-bg.png -------------------------------------------------------------------------------- /public/static/face/emoji-before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/public/static/face/emoji-before.png -------------------------------------------------------------------------------- /src/assets/403_images/403_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/403_images/403_cloud.png -------------------------------------------------------------------------------- /src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /src/assets/image/login/side-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/login/side-logo.png -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /dist/* 2 | .local 3 | .output.js 4 | /node_modules/** 5 | 6 | **/*.svg 7 | **/*.sh 8 | 9 | /public/* 10 | -------------------------------------------------------------------------------- /src/assets/image/login/qrcode-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouzhibin/zb-admin/HEAD/src/assets/image/login/qrcode-icon.png -------------------------------------------------------------------------------- /src/views/form/appendForm/index.scss: -------------------------------------------------------------------------------- 1 | .app-container-inner { 2 | text-align: center; 3 | .add { 4 | margin: 0 0 30px 0; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/styles/index.scss: -------------------------------------------------------------------------------- 1 | @import './variables.scss'; 2 | @import './sidebar.scss'; 3 | @import './transition.scss'; 4 | @import './common.scss'; 5 | @import './element.scss'; 6 | -------------------------------------------------------------------------------- /src/views/externalLinks/simple/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 简易版本分支在 :vue-admin-simple 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-3/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-2/menu1-2-1/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-2/menu1-2-2/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/components/CountTo/index.js: -------------------------------------------------------------------------------- 1 | import CountTo from './index.vue' 2 | export default CountTo 3 | if (typeof window !== 'undefined' && window.Vue) { 4 | window.Vue.component('count-to', CountTo) 5 | } 6 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-2/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/views/nested/menu2/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/api/user.ts: -------------------------------------------------------------------------------- 1 | import request from './request' 2 | 3 | export function login(data) { 4 | return request({ 5 | url: '/vue-element-perfect/user/login', 6 | method: 'post', 7 | data, 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /src/icons/svg/size.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import type { DefineComponent } from 'vue' 5 | const component: DefineComponent<{}, {}, any> 6 | export default component 7 | } 8 | -------------------------------------------------------------------------------- /src/components/pipeline/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | 2 | *.sh 3 | node_modules 4 | *.css 5 | *.jpg 6 | *.jpeg 7 | *.png 8 | *.gif 9 | *.md 10 | *.woff 11 | *.ttf 12 | .vscode 13 | .idea 14 | dist 15 | /public 16 | /docs 17 | .husky 18 | .local 19 | /bin 20 | Dockerfile 21 | -------------------------------------------------------------------------------- /src/styles/element.scss: -------------------------------------------------------------------------------- 1 | .el-table__header th { 2 | font-weight: bold; 3 | color: #252525; 4 | background: #fafafa; 5 | } 6 | 7 | .el-table .el-table__header th { 8 | background: var(--el-fill-color-light) !important; 9 | } 10 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /src/views/form/moreForm/index.scss: -------------------------------------------------------------------------------- 1 | .m-more-form { 2 | width: 100%; 3 | padding: 10px; 4 | box-sizing: border-box; 5 | :deep(.el-card) { 6 | margin-bottom: 10px; 7 | } 8 | .footer { 9 | width: 100%; 10 | text-align: center; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-1/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/views/other/svgIcon/index.scss: -------------------------------------------------------------------------------- 1 | .icon-list { 2 | box-sizing: border-box; 3 | display: flex; 4 | justify-content: space-between; 5 | width: 100%; 6 | padding: 40px 100px 0; 7 | margin-bottom: 60px; 8 | } 9 | 10 | .icon { 11 | font-size: 50px; 12 | } 13 | -------------------------------------------------------------------------------- /src/views/other/iconfont/index.scss: -------------------------------------------------------------------------------- 1 | .icon-list { 2 | box-sizing: border-box; 3 | display: flex; 4 | justify-content: space-between; 5 | width: 100%; 6 | padding: 40px 100px 0; 7 | margin-bottom: 60px; 8 | } 9 | 10 | .iconfont { 11 | font-size: 50px; 12 | } 13 | -------------------------------------------------------------------------------- /src/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/auth.ts: -------------------------------------------------------------------------------- 1 | const TokenKey = 'zb-token' 2 | 3 | export function getToken() { 4 | return localStorage.TokenKey 5 | } 6 | 7 | export function setToken(token) { 8 | return (localStorage.TokenKey = token) 9 | } 10 | 11 | export function removeToken() { 12 | return (localStorage.TokenKey = '') 13 | } 14 | -------------------------------------------------------------------------------- /src/routers/modules/dataScreen.ts: -------------------------------------------------------------------------------- 1 | const dataScreenRouter = [ 2 | { 3 | path: '/dataScreen', 4 | name: 'dataScreen', 5 | meta: { 6 | title: '可视化大屏', 7 | icon: 'Histogram', 8 | }, 9 | component: () => import('@/views/dataScreen/index.vue'), 10 | }, 11 | ] 12 | export default dataScreenRouter 13 | -------------------------------------------------------------------------------- /src/views/other/count/index.scss: -------------------------------------------------------------------------------- 1 | .count-to { 2 | display: block; 3 | margin: 10px 0; 4 | text-align: center; 5 | font-size: 40px; 6 | font-weight: 500; 7 | color: $primaryColor; 8 | } 9 | .label { 10 | color: #2f4f4f; 11 | font-size: 16px; 12 | display: inline-block; 13 | margin: 15px 30px 15px 0; 14 | } 15 | -------------------------------------------------------------------------------- /src/components/PageWrapLayout/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /src/icons/svgo.yml: -------------------------------------------------------------------------------- 1 | # replace default config 2 | 3 | # multipass: true 4 | # full: true 5 | 6 | plugins: 7 | 8 | # - name 9 | # 10 | # or: 11 | # - name: false 12 | # - name: true 13 | # 14 | # or: 15 | # - name: 16 | # param1: 1 17 | # param2: 2 18 | 19 | - removeAttrs: 20 | attrs: 21 | - 'fill' 22 | - 'fill-rule' 23 | -------------------------------------------------------------------------------- /src/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/SvgIcon' // svg component 3 | 4 | // const req = require.context('./svg', false, /\.svg$/) 5 | const req = import.meta.globEager('./svg/*.svg') 6 | 7 | const requireAll = (requireContext) => requireContext.keys().map(requireContext) 8 | requireAll(req) 9 | 10 | export default SvgIcon 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist-ssr 12 | dist 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /src/views/other/cropper/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/views/system/user/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 16 | -------------------------------------------------------------------------------- /src/views/chat/components/u-chartBox/chat.js: -------------------------------------------------------------------------------- 1 | import wePng from '@/assets/image/we.png' 2 | export const chatData = [ 3 | { 4 | is_self: 0, 5 | created_at: '2022-11-15', 6 | content: wePng, 7 | id: 1, 8 | type: 2, // 文字 9 | }, 10 | { 11 | is_self: 1, 12 | created_at: '2022-03-11', 13 | content: 'hello 你好呀!', 14 | id: 2, 15 | type: 1, // 文字 16 | }, 17 | ] 18 | -------------------------------------------------------------------------------- /src/views/nested/menu1/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/utils/element.ts: -------------------------------------------------------------------------------- 1 | import { ElLoading } from 'element-plus' 2 | import { Loading } from '@element-plus/icons-vue' 3 | let loading = null 4 | 5 | export const openLoading = (options = {}) => { 6 | const text = options.text || '加载中' 7 | loading = ElLoading.service({ 8 | lock: true, 9 | text: text, 10 | }) 11 | } 12 | export const closeLoading = () => { 13 | loading && loading.close() 14 | } 15 | -------------------------------------------------------------------------------- /src/views/echarts/migrationMap/index.scss: -------------------------------------------------------------------------------- 1 | .echarts-map { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | overflow: hidden; 6 | background: #001540; 7 | box-sizing: border-box; 8 | .info { 9 | position: absolute; 10 | left: 0; 11 | width: 100%; 12 | font-weight: bold; 13 | z-index: 9; 14 | } 15 | ::v-deep(.el-card) { 16 | border-radius: 0; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/views/login/components/LoginQrcode.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | Vue-Admin-Perfect 4 | 5 | 6 | 7 | 8 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /src/icons/svg/fullscreen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/functionPage/informationList/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // 一行的字符数,如果超过会进行换行,默认为80 3 | printWidth: 140, 4 | // 缩进制表符宽度 | 空格数 5 | tabWidth: 2, 6 | // 行位是否使用分号,默认为true 7 | semi: false, 8 | vueIndentScriptAndStyle: true, 9 | // 字符串是否使用单引号,默认为false,使用双引号 10 | singleQuote: true, 11 | // 是否使用尾逗号,有三个可选值"" 12 | trailingComma: 'all', 13 | proseWrap: 'never', 14 | htmlWhitespaceSensitivity: 'strict', 15 | endOfLine: 'auto', 16 | }; 17 | -------------------------------------------------------------------------------- /src/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/layout/components/Header/components/Height.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | -------------------------------------------------------------------------------- /src/views/externalLinks/wechat/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 欢迎大家加微信哈,共同讨论,学习 5 | 6 | 7 | 8 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /src/views/externalLinks/iframe/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | -------------------------------------------------------------------------------- /src/views/echarts/migrationMap/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | Echarts 实现飞线图、地图增加图标、高亮 4 | 5 | 6 | 7 | 8 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /src/plugins/ElIcons.ts: -------------------------------------------------------------------------------- 1 | // 注册icon组件 2 | import * as ElIconsModules from '@element-plus/icons-vue' 3 | 4 | export const registerElIcons = (app) => { 5 | // 全局注册element-plus icon图标组件 6 | Object.keys(ElIconsModules).forEach((key) => { 7 | //循环遍历组件名称 8 | if ('Menu' !== key) { 9 | //如果不是图标组件不是Menu,就跳过,否则加上ICon的后缀 10 | app.component(key, ElIconsModules[key]) 11 | } else { 12 | app.component(key + 'Icon', ElIconsModules[key]) 13 | } 14 | }) 15 | } 16 | -------------------------------------------------------------------------------- /src/components/PageWrapLayout/index.scss: -------------------------------------------------------------------------------- 1 | .m-container-layout { 2 | width: 100%; 3 | height: 100%; 4 | display: flex; 5 | padding: 10px 12px; 6 | box-sizing: border-box; 7 | .m-container-layout-inner { 8 | flex: 1; 9 | display: flex; 10 | flex-direction: column; 11 | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); 12 | background: white; 13 | padding: 20px; 14 | width: 100%; 15 | height: 100%; 16 | box-sizing: border-box; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/layout/components/Header/ToolLeft.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 20 | -------------------------------------------------------------------------------- /src/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/emojis.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | imgs: [ 3 | '爱你', 4 | '爱情', 5 | '爱心', 6 | '傲慢', 7 | '白眼', 8 | '抱拳', 9 | '鄙视', 10 | '闭嘴', 11 | '便便', 12 | '擦汗', 13 | '菜刀', 14 | '差劲', 15 | '呲牙', 16 | '大哭', 17 | '蛋糕', 18 | '刀', 19 | '得意', 20 | '凋谢', 21 | '发呆', 22 | 'NO', 23 | 'OK', 24 | '发抖', 25 | '发怒', 26 | '饭', 27 | '飞吻', 28 | '奋斗', 29 | '疯了', 30 | '尴尬', 31 | '勾引', 32 | '鼓掌', 33 | '哈欠', 34 | ], 35 | } 36 | -------------------------------------------------------------------------------- /src/layout/components/Footer/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 20 | -------------------------------------------------------------------------------- /src/views/system/dictionary/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 19 | 20 | 23 | -------------------------------------------------------------------------------- /src/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/store/index.ts: -------------------------------------------------------------------------------- 1 | import { defineStore, createPinia } from 'pinia' 2 | // 引入持久化插件 3 | import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' 4 | 5 | export const Store = defineStore({ 6 | // id: 必须的,在所有 Store 中唯一 7 | id: 'globalState', 8 | // state: 返回对象的函数 9 | state: () => ({}), 10 | getters: {}, 11 | actions: {}, 12 | persist: { 13 | // 本地存储的名称 14 | key: 'globalState', 15 | //保存的位置 16 | storage: window.sessionStorage, //localstorage 17 | }, 18 | }) 19 | 20 | const pinia = createPinia() 21 | //pinia使用 22 | pinia.use(piniaPluginPersistedstate) 23 | export default pinia 24 | -------------------------------------------------------------------------------- /src/utils/requestAnimationFrameThrottle.js: -------------------------------------------------------------------------------- 1 | import raf from 'raf' 2 | 3 | /** 4 | * requestAnimationFrame 节流 5 | * scroll 和 touchmove 等事件触发很频繁,比屏幕刷新频率更快,将导致无效的渲染和重绘 6 | * 这里使用 requestAnimationFrame 来优化滚动处理,在一帧中只进行一次有效重绘 7 | */ 8 | export default function requestAnimationFrameThrottle(callback) { 9 | let id 10 | 11 | const factory = (args) => () => { 12 | id = null 13 | callback(...args) 14 | } 15 | 16 | const throttled = (...args) => { 17 | if (id == null) { 18 | id = raf(factory(args)) 19 | } 20 | } 21 | 22 | throttled.cancel = () => raf.cancel(id) 23 | 24 | return throttled 25 | } 26 | -------------------------------------------------------------------------------- /src/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/chat/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 聊天内容框,功能有发送emoji表情,上传图片,发送图片,内容滚动,发送文字 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 24 | -------------------------------------------------------------------------------- /src/hooks/useWrapComponents.ts: -------------------------------------------------------------------------------- 1 | // 自定义name的壳的集合 2 | import { h } from 'vue' 3 | 4 | const wrapperMap = new Map() 5 | 6 | export const useWrapComponents = (Component, route) => { 7 | let wrapper 8 | if (Component) { 9 | const wrapperName = route.name 10 | if (wrapperMap.has(wrapperName)) { 11 | wrapper = wrapperMap.get(wrapperName) 12 | } else { 13 | wrapper = { 14 | name: wrapperName, 15 | render() { 16 | return h('div', { className: 'app-main-inner' }, Component) 17 | }, 18 | } 19 | wrapperMap.set(wrapperName, wrapper) 20 | } 21 | return h(wrapper) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/layout/LayoutHorizontal/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 25 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 10 | 11 | 12 | We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue. 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/routers/modules/chat.ts: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout/index.vue' 4 | 5 | const chartsRouter = [ 6 | { 7 | path: '/chat', 8 | component: Layout, 9 | redirect: '/chat/index', 10 | name: 'chat', 11 | meta: { 12 | title: '聊天框', 13 | icon: 'chat-square', 14 | }, 15 | children: [ 16 | { 17 | path: '/chat/index', 18 | component: () => import('@/views/chat/index.vue'), 19 | name: 'chatBox', 20 | meta: { title: '聊天框', icon: 'chat-square' }, 21 | }, 22 | ], 23 | }, 24 | ] 25 | 26 | export default chartsRouter 27 | -------------------------------------------------------------------------------- /src/views/other/cardDrag/data.ts: -------------------------------------------------------------------------------- 1 | export const iconData = [ 2 | 'management', 3 | 'baseball', 4 | 'Basketball', 5 | 'BellFilled', 6 | 'Bell', 7 | 'AddLocation', 8 | 'Aim', 9 | 'AlarmClock', 10 | 'Apple', 11 | 'ArrowDownBold', 12 | 'Burger', 13 | 'Brush', 14 | 'BrushFilled', 15 | 'RemoveFilled', 16 | 'QuestionFilled', 17 | 'Promotion', 18 | 'Printer', 19 | 'School', 20 | 'Setting', 21 | 'WarningFilled', 22 | 'ZoomOut', 23 | 'WalletFilled', 24 | 'User', 25 | 'ToiletPaper', 26 | 'Sunrise', 27 | 'Sunny', 28 | 'SwitchButton', 29 | 'TakeawayBox', 30 | 'Ticket', 31 | 'StarFilled', 32 | 'Stamp', 33 | 'Stopwatch', 34 | 'SortDown', 35 | 'SemiSelect', 36 | 'Search', 37 | ] 38 | -------------------------------------------------------------------------------- /src/layout/components/Mobile/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/layout/components/Header/components/ScreenFull.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 24 | -------------------------------------------------------------------------------- /src/icons/svg/report-form.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/excel/exportExcel/index.scss: -------------------------------------------------------------------------------- 1 | .header { 2 | display: flex; 3 | padding: 16px 16px 16px 16px; 4 | margin-bottom: 16px; 5 | border-radius: 4px; 6 | background: white; 7 | box-shadow: 0 0 12px rgb(0 0 0 / 5%); 8 | } 9 | .footer { 10 | flex: 1; 11 | display: flex; 12 | padding: 16px; 13 | flex-direction: column; 14 | border-radius: 4px; 15 | overflow: hidden; 16 | background: white; 17 | box-shadow: 0 0 12px rgb(0 0 0 / 5%); 18 | position: relative; 19 | box-sizing: border-box; 20 | .footer-inner { 21 | position: relative; 22 | width: 100%; 23 | height: 100%; 24 | } 25 | .table { 26 | position: absolute; 27 | left: 0; 28 | top: 0; 29 | width: 100%; 30 | height: 100%; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/utils/clipboard.ts: -------------------------------------------------------------------------------- 1 | import Clipboard from 'clipboard' 2 | import { ElMessage } from 'element-plus' 3 | 4 | function clipboardSuccess() { 5 | ElMessage({ 6 | message: '复制成功', 7 | type: 'success', 8 | duration: 1500, 9 | }) 10 | } 11 | 12 | function clipboardError() { 13 | ElMessage({ 14 | message: '复制失败', 15 | type: 'error', 16 | }) 17 | } 18 | 19 | export default function handleClipboard(text, event) { 20 | const clipboard: any = new Clipboard(event.target, { 21 | text: () => text, 22 | }) 23 | clipboard.on('success', () => { 24 | clipboardSuccess() 25 | clipboard.destroy() 26 | }) 27 | clipboard.on('error', () => { 28 | clipboardError() 29 | clipboard.destroy() 30 | }) 31 | clipboard.onClick(event) 32 | } 33 | -------------------------------------------------------------------------------- /src/icons/svg/task.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/u-container-layout/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 31 | -------------------------------------------------------------------------------- /src/components/SwitchDark/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 21 | -------------------------------------------------------------------------------- /src/layout/LayoutHorizontal/HeaderHorizontal/index.scss: -------------------------------------------------------------------------------- 1 | .m-layout-header { 2 | width: 100%; 3 | transition: width 0.28s; 4 | flex-shrink: 0; 5 | box-sizing: border-box; 6 | box-shadow: 0 1px 4px rgb(0 21 41 / 8%); 7 | .header-inner { 8 | height: 50px; 9 | width: 100%; 10 | border-bottom: 1px solid #eee; 11 | display: flex; 12 | background-color: $menuBg; 13 | align-items: center; 14 | padding: 0 10px 0 0; 15 | box-sizing: border-box; 16 | justify-content: space-between; 17 | } 18 | } 19 | .fixed-header { 20 | position: fixed; 21 | top: 0; 22 | right: 0; 23 | z-index: 9; 24 | } 25 | 26 | .menu-horizontal { 27 | flex: 1; 28 | overflow: hidden; 29 | height: 100%; 30 | 31 | :deep(.el-menu-item) { 32 | height: 100%; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/views/functionPage/informationList/components/Search.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 搜索 9 | 10 | 11 | 12 | 13 | 14 | 25 | 26 | 31 | -------------------------------------------------------------------------------- /src/views/functionPage/fullscreen/index.scss: -------------------------------------------------------------------------------- 1 | .app-container-inner { 2 | display: flex; 3 | align-items: center; 4 | justify-content: center; 5 | position: relative; 6 | .header { 7 | padding: 20px; 8 | position: absolute; 9 | left: 0; 10 | top: 0; 11 | width: 100%; 12 | border-bottom: 1px solid #0000001a; 13 | .title { 14 | margin-bottom: 20px; 15 | } 16 | } 17 | .fullscreen { 18 | display: flex; 19 | flex-direction: column; 20 | background: white; 21 | width: 300px; 22 | height: 300px; 23 | box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%); 24 | .title { 25 | padding: 20px; 26 | } 27 | .inner { 28 | flex: 1; 29 | display: flex; 30 | align-items: center; 31 | justify-content: center; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/compass.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/DataScreen/migrationEcharts/data.js: -------------------------------------------------------------------------------- 1 | export const cityIconData = [ 2 | { 3 | adcode: 650000, 4 | name: '新疆维吾尔自治区', 5 | value: [88.999903, 43.607078], 6 | }, 7 | { 8 | // adcode: 150000, 9 | name: '内蒙古自治区', 10 | value: [119.24787, 42.205741], 11 | }, 12 | , 13 | { 14 | // adcode: 150000, 15 | name: '内蒙古自治区', 16 | value: [110.627161, 41.16628], 17 | }, 18 | { 19 | // adcode: 540000, 20 | name: '西藏自治区', 21 | value: [89.483714, 30.251951], 22 | }, 23 | { 24 | // adcode: 630000, 25 | name: '青海省', 26 | value: [102.064693, 37.084008], 27 | }, 28 | { 29 | // adcode: 530000, 30 | name: '云南省', 31 | value: [102.187665, 25.083688], 32 | }, 33 | { 34 | // adcode: 610000, 35 | name: '陕西省', 36 | value: [109.20663, 35.018625], 37 | }, 38 | ] 39 | -------------------------------------------------------------------------------- /src/views/system/dept/index.scss: -------------------------------------------------------------------------------- 1 | .header { 2 | display: flex; 3 | padding: 16px 16px 0px 16px; 4 | margin-bottom: 16px; 5 | border-radius: 4px; 6 | background: white; 7 | box-shadow: 0 0 12px rgb(0 0 0 / 5%); 8 | } 9 | .footer { 10 | flex: 1; 11 | display: flex; 12 | padding: 16px; 13 | flex-direction: column; 14 | border-radius: 4px; 15 | overflow: hidden; 16 | background: white; 17 | box-shadow: 0 0 12px rgb(0 0 0 / 5%); 18 | position: relative; 19 | box-sizing: border-box; 20 | .util { 21 | margin-bottom: 15px; 22 | display: flex; 23 | justify-content: flex-end; 24 | flex-shrink: 0; 25 | } 26 | .table-inner { 27 | flex: 1; 28 | position: relative; 29 | } 30 | .table { 31 | position: absolute; 32 | left: 0; 33 | top: 0; 34 | width: 100%; 35 | height: 100%; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/styles/variables.scss: -------------------------------------------------------------------------------- 1 | // base color 2 | $blue: #324157; 3 | $light-blue: #3a71a8; 4 | $red: #c03639; 5 | $pink: #e65d6e; 6 | $green: #30b08f; 7 | $tiffany: #4ab7bd; 8 | $yellow: #fec171; 9 | $panGreen: #30b08f; 10 | 11 | /* 全局 css 变量 */ 12 | $primaryColor: var(--el-color-primary); 13 | 14 | // sidebar 15 | $menuText: #bfcbd9; 16 | $menuActiveText: #409eff; 17 | $subMenuActiveText: #f4f4f5; 18 | 19 | $menuBg: #304156; 20 | $menuHover: #263445; 21 | 22 | $subMenuBg: #1f2d3d; 23 | $subMenuHover: #001528; 24 | 25 | $sideBarWidth: 210px; 26 | 27 | :export { 28 | menuText: $menuText; 29 | menuActiveText: $menuActiveText; 30 | subMenuActiveText: $subMenuActiveText; 31 | menuBg: $menuBg; 32 | menuHover: $menuHover; 33 | subMenuBg: $subMenuBg; 34 | subMenuHover: $subMenuHover; 35 | sideBarWidth: $sideBarWidth; 36 | primaryColor: $primaryColor; 37 | } 38 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "moduleResolution": "Node", 7 | "strict": false, 8 | "jsx": "preserve", 9 | "sourceMap": true, 10 | "resolveJsonModule": true, 11 | "isolatedModules": true, 12 | "esModuleInterop": true, 13 | "allowSyntheticDefaultImports": true, 14 | "lib": ["ESNext", "DOM"], 15 | "noEmit": true, 16 | // 跳过库检查,解决打包失败 17 | "skipLibCheck": true, 18 | // 解析非相对模块名的基准目录 19 | "baseUrl": "./", 20 | // 模块名到基于 baseUrl 的路径映射的列表。 21 | "paths": { 22 | "@": ["src"], 23 | "@/*": ["src/*"] 24 | } 25 | }, 26 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], 27 | "references": [ 28 | { "path": "./tsconfig.node.json" } 29 | ], 30 | "exclude": ["node_modules","dist","**/*.js"] 31 | } 32 | -------------------------------------------------------------------------------- /src/icons/svg/horn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/functionPage/informationList/components/Pagination.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 14 | 27 | 28 | 35 | -------------------------------------------------------------------------------- /src/icons/svg/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/layout/components/Header/ToolRight.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 20 | 21 | 30 | -------------------------------------------------------------------------------- /src/components/SvgIcon/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 26 | 27 | 36 | -------------------------------------------------------------------------------- /src/layout/components/SubMenu/MenuItem.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{ subItem?.meta?.title }} 8 | 9 | 10 | 11 | 12 | 34 | -------------------------------------------------------------------------------- /src/icons/svg/todo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/layout/components/Header/components/CollapseIcon.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 16 | 31 | -------------------------------------------------------------------------------- /src/styles/transition.scss: -------------------------------------------------------------------------------- 1 | // global transition css 2 | 3 | /* fade */ 4 | .fade-enter-active, 5 | .fade-leave-active { 6 | transition: opacity 0.28s; 7 | } 8 | 9 | .fade-enter, 10 | .fade-leave-active { 11 | opacity: 0; 12 | } 13 | 14 | /* 路由 */ 15 | .fade-slide-leave-active, 16 | .fade-slide-enter-active { 17 | transition: all 0.3s; 18 | } 19 | 20 | .fade-slide-enter-from { 21 | opacity: 0; 22 | transform: translateX(-30px); 23 | } 24 | 25 | .fade-slide-leave-to { 26 | opacity: 0; 27 | transform: translateX(30px); 28 | } 29 | 30 | // logo动画 31 | .sidebarLogoFade-enter-active { 32 | transition: opacity 1.5s; 33 | } 34 | .sidebarLogoFade-enter-from { 35 | opacity: 0; 36 | } 37 | .sidebarLogoFade-leave-to { 38 | opacity: 0; 39 | } 40 | 41 | // 面包屑动画 方案1 42 | .breadcrumb-enter-active { 43 | transition: all 0.25s; 44 | } 45 | .breadcrumb-enter-from, 46 | .breadcrumb-leave-active { 47 | opacity: 0; 48 | transform: translateX(10px) skewX(-10deg); 49 | } 50 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 17 | 18 | 38 | -------------------------------------------------------------------------------- /src/views/other/codeMirror/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 代码编辑器组件示例 7 | 8 | 9 | 10 | 15 | 16 | 17 | 20 | 21 | 44 | -------------------------------------------------------------------------------- /src/views/other/textClamp/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ expanded ? '收起' : '展开' }} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 19 | 20 | 31 | -------------------------------------------------------------------------------- /src/layout/components/SubMenu/Link.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 44 | 45 | 50 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import router from './routers' 4 | import pinia from './store' 5 | 6 | import { registerElIcons } from '@/plugins/ElIcons' 7 | // 引入全局组件布局 8 | import PageWrapLayout from '@/components/PageWrapLayout/index.vue' 9 | // 权限路由 10 | import './permission' 11 | // svg-icons注册导入 12 | import 'virtual:svg-icons-register' 13 | import SvgIcon from '@/components/SvgIcon/index.vue' // svg component 14 | // UI框架 element-plus 15 | import ElementPlus from 'element-plus' 16 | import 'element-plus/dist/index.css' 17 | // 引入暗黑模式 element-plus 2.2 内置暗黑模式 18 | import 'element-plus/theme-chalk/dark/css-vars.css' 19 | // 自定义暗黑模式 20 | import '@/styles/element-dark.scss' 21 | // 引入阿里图标库 22 | import '@/assets/iconfont/iconfont.css' 23 | import '@/assets/iconfont/iconfont.js' 24 | 25 | const app = createApp(App) 26 | registerElIcons(app) 27 | 28 | app.component('SvgIcon', SvgIcon) 29 | app.component('PageWrapLayout', PageWrapLayout) 30 | 31 | app.use(pinia) 32 | app.use(router) 33 | app.use(ElementPlus).mount('#app') 34 | -------------------------------------------------------------------------------- /src/views/form/searchForm/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ formValue }} 6 | 7 | 8 | 9 | 32 | 33 | 36 | -------------------------------------------------------------------------------- /src/api/errorCodeType.ts: -------------------------------------------------------------------------------- 1 | export const errorCodeType = function (code: string): string { 2 | let errMessage = '未知错误' 3 | switch (code) { 4 | case 400: 5 | errMessage = '请求失败!请您稍后重试' 6 | break 7 | case 401: 8 | errMessage = '未授权,请重新登录' 9 | break 10 | case 403: 11 | errMessage = '当前账号无权限访问!' 12 | break 13 | case 404: 14 | errMessage = '你所访问的资源不存在!' 15 | break 16 | case 405: 17 | errMessage = '请求方式错误!请您稍后重试' 18 | break 19 | case 408: 20 | errMessage = '请求超时!请您稍后重试' 21 | break 22 | case 500: 23 | errMessage = '服务器端出错' 24 | break 25 | case 501: 26 | errMessage = '网络未实现' 27 | break 28 | case 502: 29 | errMessage = '网络错误' 30 | break 31 | case 503: 32 | errMessage = '服务不可用' 33 | break 34 | case 504: 35 | errMessage = '网络超时' 36 | break 37 | case 505: 38 | errMessage = 'http版本不支持该请求' 39 | break 40 | default: 41 | errMessage = `其他连接错误 --${code}` 42 | } 43 | return errMessage 44 | } 45 | -------------------------------------------------------------------------------- /src/icons/svg/entrust.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/functionPage/fullscreen/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | window切换全屏 6 | {{ isFullscreen ? '退出全屏' : '点击全屏' }} 7 | 8 | 9 | DOM元素切换全屏 10 | 11 | {{ isFullscreen ? '退出全屏' : '点击全屏' }} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 27 | 28 | 31 | -------------------------------------------------------------------------------- /src/views/other/clipboard/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 输入内容,并点击复制按钮 6 | 7 | 8 | 复制 9 | 10 | 11 | 12 | 复制成功后可在这粘贴测试 13 | 14 | 15 | 16 | 17 | 18 | 28 | -------------------------------------------------------------------------------- /src/layout/LayoutVertical/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 17 | 18 | 47 | -------------------------------------------------------------------------------- /src/views/login/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {{ accountLogin ? '扫码登录' : '账号登录' }} 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 32 | 35 | -------------------------------------------------------------------------------- /src/views/other/markDown/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 12 | 提交 13 | 14 | 15 | 16 | 17 | 30 | 31 | 42 | -------------------------------------------------------------------------------- /src/hooks/useResizeElement.ts: -------------------------------------------------------------------------------- 1 | import ResizeObserver from 'resize-observer-polyfill' 2 | import { onBeforeUnmount } from 'vue' 3 | import requestAnimationFrameThrottle from '@/utils/requestAnimationFrameThrottle' 4 | export const useResizeElement = (chart, chartsRef) => { 5 | let observer = null 6 | let widthW = 0 7 | let heightW = 0 8 | const handleResize = (entries) => { 9 | const { contentRect } = entries[0] 10 | let { width, height } = contentRect 11 | width = Math.floor(width) 12 | height = Math.floor(height) 13 | if (widthW !== width || heightW !== height) { 14 | widthW = width 15 | heightW = height 16 | chart && chart.resize() 17 | } 18 | } 19 | const addObserver = () => { 20 | observer = new ResizeObserver(requestAnimationFrameThrottle(handleResize)) 21 | observer.observe(chartsRef) 22 | } 23 | 24 | const removeObserver = () => { 25 | if (observer) { 26 | observer.disconnect() 27 | observer = null 28 | } 29 | chart && chart.dispose() 30 | } 31 | 32 | onBeforeUnmount(() => { 33 | removeObserver() 34 | }) 35 | 36 | return { 37 | addObserver, 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/layout/components/Header/components/Setting.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 16 | 17 | 43 | -------------------------------------------------------------------------------- /src/views/other/cardDrag/index.scss: -------------------------------------------------------------------------------- 1 | .m-card-drag { 2 | height: 100%; 3 | width: 100%; 4 | display: flex; 5 | flex-direction: column; 6 | .header { 7 | flex-shrink: 0; 8 | } 9 | } 10 | .footer { 11 | flex: 1; 12 | padding: 10px; 13 | box-sizing: border-box; 14 | overflow: hidden; 15 | } 16 | .card { 17 | display: flex; 18 | flex-wrap: wrap; 19 | justify-content: space-between; 20 | height: 100%; 21 | box-sizing: border-box; 22 | padding: 20px; 23 | overflow-x: hidden; 24 | background-color: var(--el-fill-color-blank); 25 | border: 1px solid var(--el-border-color-light); 26 | border-radius: 4px; 27 | box-shadow: 0 0 12px rgb(0 0 0 / 5%); 28 | } 29 | .item-group-item { 30 | position: relative; 31 | width: calc(100% / 5.3); 32 | margin-bottom: 10px; 33 | flex-direction: column; 34 | display: flex; 35 | align-items: center; 36 | justify-content: center; 37 | min-height: 100px; 38 | cursor: move; 39 | font-weight: 500; 40 | border: 1px solid rgba(0, 0, 0, 0.125); 41 | } 42 | .chosenClass { 43 | opacity: 0.6; 44 | border: 1px solid rgba(64, 158, 255, 0.2); 45 | } 46 | .item-icon { 47 | width: 100%; 48 | display: flex; 49 | justify-content: center; 50 | } 51 | -------------------------------------------------------------------------------- /src/layout/LayoutVertical/HeaderVertical/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 35 | 36 | 39 | -------------------------------------------------------------------------------- /src/layout/components/Header/components/Hamburger.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 首页 7 | 8 | 9 | 10 | {{ item.meta.title }} 11 | {{ item.meta.title }} 12 | 13 | 14 | 15 | 16 | 17 | 32 | -------------------------------------------------------------------------------- /src/icons/svg/eye-open.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/layout/components/Main/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 23 | 24 | 40 | -------------------------------------------------------------------------------- /src/icons/svg/go-out.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/put-in.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/layout/LayoutVertical/HeaderVertical/index.scss: -------------------------------------------------------------------------------- 1 | .mobile { 2 | .m-layout-header { 3 | left: 0 !important; 4 | width: 100% !important; 5 | } 6 | } 7 | .show-tag { 8 | height: 90px; 9 | } 10 | 11 | .zb-no-fixed-header { 12 | width: 100% !important; 13 | } 14 | 15 | .m-layout-header { 16 | width: 100%; 17 | background: white; 18 | transition: width 0.28s; 19 | flex-shrink: 0; 20 | box-sizing: border-box; 21 | box-shadow: 0 1px 4px rgb(0 21 41 / 8%); 22 | 23 | .header-inner { 24 | height: 50px; 25 | width: 100%; 26 | border-bottom: 1px solid #eee; 27 | display: flex; 28 | align-items: center; 29 | padding: 0 10px 0 0; 30 | box-sizing: border-box; 31 | justify-content: space-between; 32 | } 33 | } 34 | .fixed-header { 35 | position: fixed; 36 | top: 0; 37 | right: 0; 38 | z-index: 9; 39 | } 40 | .collapse { 41 | width: calc(100% - 60px); 42 | } 43 | .no-collapse { 44 | width: calc(100% - 210px); 45 | } 46 | 47 | .el-dropdown { 48 | display: flex; 49 | height: 100%; 50 | align-items: center; 51 | } 52 | 53 | .transverseMenu { 54 | display: flex; 55 | .el-menu { 56 | overflow: hidden; 57 | } 58 | :deep(.el-menu-item) { 59 | height: 100% !important; 60 | } 61 | .tool-bar-right { 62 | display: flex; 63 | justify-content: flex-end; 64 | min-width: 300px; 65 | flex-shrink: 0; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/layout/components/Header/components/globalComSize.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{ assemblySizeListCh[item] }} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 34 | 35 | 42 | -------------------------------------------------------------------------------- /src/icons/svg/home.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/other/rightMenu/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 右键菜单 4 | 5 | 6 | 7 | 8 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/routers/modules/table.ts: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout/index.vue' 4 | 5 | const tableRouter = [ 6 | { 7 | path: '/table', 8 | component: Layout, 9 | redirect: '/table/comprehensive', 10 | name: 'table', 11 | meta: { 12 | title: '超级表格', 13 | icon: 'School', 14 | }, 15 | children: [ 16 | { 17 | path: '/table/comprehensive', 18 | component: () => import('@/views/table/ComprehensiveTable/index.vue'), 19 | name: 'comprehensive', 20 | meta: { title: '综合表格', keepAlive: true, icon: 'MenuIcon' }, 21 | }, 22 | { 23 | path: '/table/inlineTable', 24 | component: () => import('@/views/table/InlineEditTable/index.vue'), 25 | name: 'inlineTable', 26 | meta: { title: '行内编辑', keepAlive: true, icon: 'MenuIcon' }, 27 | }, 28 | { 29 | path: '/table/editableProTable', 30 | component: () => import('@/views/table/EditableProTable/index.vue'), 31 | name: 'editableProTable', 32 | meta: { title: '可编辑表格', keepAlive: true, icon: 'MenuIcon' }, 33 | }, 34 | // { 35 | // path: 'virtualTable', 36 | // component: () => import('@/views/table/VirtualTable.vue'), 37 | // name: 'virtualTable', 38 | // meta: { title: '虚拟表格', keepAlive: true , icon: 'MenuIcon'} 39 | // }, 40 | ], 41 | }, 42 | ] 43 | 44 | export default tableRouter 45 | -------------------------------------------------------------------------------- /src/icons/svg/notice.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/routers/modules/externalLink.ts: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout/index.vue' 2 | 3 | const externalLink = [ 4 | { 5 | path: '/external-link', 6 | component: Layout, 7 | redirect: '/external-link/wechat', 8 | name: 'external-link', 9 | meta: { 10 | title: '外部链接', 11 | icon: 'link', 12 | }, 13 | children: [ 14 | // { 15 | // path: '/external-link/wechat', 16 | // name: 'wechat', 17 | // component: () => import('@/views/externalLinks/wechat/index.vue'), 18 | // meta: { title: '加微信群', icon: 'MenuIcon' } 19 | // }, 20 | { 21 | path: 'https://github.com/zouzhibin/vue-admin-perfect', 22 | name: 'github', 23 | meta: { title: 'Github 地址', icon: 'MenuIcon' }, 24 | }, 25 | { 26 | path: 'https://gitee.com/yuanzbz/vue-admin-perfect?_from=gitee_search', 27 | name: 'github', 28 | meta: { title: 'Gitee 地址', icon: 'MenuIcon' }, 29 | }, 30 | { 31 | path: 'https://yuanzbz.gitee.io/vue-admin-simple', 32 | name: 'simple', 33 | meta: { title: '简易版本', icon: 'MenuIcon' }, 34 | component: () => import('@/views/externalLinks/simple/index.vue'), 35 | }, 36 | { 37 | path: '/external-link/iframe', 38 | component: () => import('@/views/externalLinks/iframe/index.vue'), 39 | name: 'iframe', 40 | meta: { title: '内嵌 iframe', icon: 'MenuIcon' }, 41 | }, 42 | ], 43 | }, 44 | ] 45 | 46 | export default externalLink 47 | -------------------------------------------------------------------------------- /src/routers/modules/system.ts: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout/index.vue' 4 | 5 | const systemRouter = [ 6 | { 7 | path: '/system', 8 | component: Layout, 9 | redirect: '/system/user', 10 | name: 'system', 11 | meta: { 12 | title: '系统管理', 13 | icon: 'Setting', 14 | }, 15 | children: [ 16 | { 17 | path: '/system/user', 18 | component: () => import('@/views/system/user/index.vue'), 19 | name: 'user', 20 | meta: { title: '用户管理', icon: 'MenuIcon' }, 21 | }, 22 | { 23 | path: '/system/dept', 24 | component: () => import('@/views/system/dept/index.vue'), 25 | name: 'dept', 26 | meta: { title: '部门管理', icon: 'MenuIcon' }, 27 | }, 28 | { 29 | path: '/system/role', 30 | component: () => import('@/views/system/role/index.vue'), 31 | name: 'role', 32 | meta: { title: '角色管理', icon: 'MenuIcon' }, 33 | }, 34 | { 35 | path: '/system/menu', 36 | component: () => import('@/views/system/menu/index.vue'), 37 | name: 'menu', 38 | meta: { title: '菜单管理', icon: 'MenuIcon' }, 39 | }, 40 | { 41 | path: '/system/dictionary', 42 | component: () => import('@/views/system/dictionary/index.vue'), 43 | name: 'dictionary', 44 | meta: { title: '字典管理', icon: 'MenuIcon' }, 45 | }, 46 | ], 47 | }, 48 | ] 49 | 50 | export default systemRouter 51 | -------------------------------------------------------------------------------- /src/views/home/index.scss: -------------------------------------------------------------------------------- 1 | .personal { 2 | .name { 3 | margin-top: 15px; 4 | font-size: 24px; 5 | font-weight: 500; 6 | color: rgb(38, 38, 38); 7 | } 8 | .description { 9 | margin-top: 8px; 10 | } 11 | .list { 12 | margin-top: 18px; 13 | line-height: 30px; 14 | text-align: left; 15 | } 16 | } 17 | .card-header { 18 | display: flex; 19 | justify-content: space-between; 20 | align-items: center; 21 | } 22 | 23 | .text { 24 | font-size: 14px; 25 | } 26 | .grid-content { 27 | display: flex; 28 | .left { 29 | width: 40%; 30 | height: 100px; 31 | display: flex; 32 | align-items: center; 33 | justify-content: center; 34 | background: #2d8cf0; 35 | } 36 | .right { 37 | display: flex; 38 | flex-direction: column; 39 | padding-left: 20px; 40 | justify-content: center; 41 | .h2 { 42 | font-size: 24px; 43 | margin-bottom: 10px; 44 | } 45 | } 46 | } 47 | .custom { 48 | :deep(.el-card__body) { 49 | padding: 0; 50 | } 51 | } 52 | .item { 53 | margin-bottom: 18px; 54 | } 55 | 56 | .box-card { 57 | //height: 100%; 58 | position: relative; 59 | margin-bottom: 10px; 60 | width: 100%; 61 | .wechat { 62 | position: absolute; 63 | width: 150px; 64 | right: 0; 65 | top: 0; 66 | } 67 | } 68 | .card-item { 69 | background: linear-gradient(50deg, #1890ff, #77e19d); 70 | } 71 | .home-container { 72 | width: 100%; 73 | height: 100%; 74 | display: flex; 75 | padding: 16px; 76 | box-sizing: border-box; 77 | font-size: 14px; 78 | } 79 | -------------------------------------------------------------------------------- /src/views/echarts/simple/components/gauge.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 64 | -------------------------------------------------------------------------------- /src/utils/routers.ts: -------------------------------------------------------------------------------- 1 | import path from 'path-browserify' 2 | /** 3 | * 通过递归过滤异步路由表 4 | * @param routes asyncRoutes 5 | * @param roles 6 | */ 7 | export function filterAsyncRoutes(routes, roles) { 8 | const res = [] 9 | routes.forEach((route) => { 10 | const tmp = { ...route } 11 | if (hasPermission(roles, tmp)) { 12 | if (tmp.children) { 13 | tmp.children = filterAsyncRoutes(tmp.children, roles) 14 | } 15 | res.push(tmp) 16 | } 17 | }) 18 | return res 19 | } 20 | 21 | /** 22 | * 使用 meta.role 来确定当前用户是否具有权限 23 | * @param roles 24 | * @param route 25 | */ 26 | export function hasPermission(roles, route) { 27 | if (route.meta && route.meta.roles) { 28 | return roles.some((role) => route.meta.roles.includes(role)) 29 | } else { 30 | return false 31 | } 32 | } 33 | 34 | /** 35 | * @description 使用递归,过滤需要缓存的路由 36 | * @param {Array} _route 所有路由表 37 | * @param {Array} _cache 缓存的路由表 38 | * @return void 39 | * */ 40 | 41 | export function filterKeepAlive(routers) { 42 | const cacheRouter: any[] = [] 43 | const deep = (routers) => { 44 | routers.forEach((item) => { 45 | if (item.meta?.keepAlive && item.name) { 46 | cacheRouter.push(item.name) 47 | } 48 | if (item.children && item.children.length) { 49 | deep(item.children) 50 | } 51 | }) 52 | } 53 | deep(routers) 54 | return cacheRouter 55 | } 56 | 57 | export function handleRoutes(routers, pathUrl = '') { 58 | routers.forEach((item) => { 59 | item.path = path.resolve(pathUrl, item.path) 60 | }) 61 | } 62 | -------------------------------------------------------------------------------- /src/layout/components/SubMenu/SubMenu.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {{ subItem?.meta?.title }} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 52 | -------------------------------------------------------------------------------- /src/routers/modules/excel.ts: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout/index.vue' 2 | 3 | const excelRouter = [ 4 | { 5 | path: '/excel', 6 | component: Layout, 7 | redirect: '/excel/export-excel', 8 | name: 'excel', 9 | meta: { 10 | title: 'Excel&Zip', 11 | icon: 'School', 12 | }, 13 | children: [ 14 | { 15 | path: '/excel/export-excel', 16 | component: () => import('@/views/excel/exportExcel/index.vue'), 17 | name: 'export-excel', 18 | meta: { title: '导出 Excel', icon: 'MenuIcon' }, 19 | }, 20 | { 21 | path: '/excel/export-merge-header', 22 | component: () => import('@/views/excel/exportMergeHeader/index.vue'), 23 | name: 'export-merge-header', 24 | meta: { title: '导出 多级表头', icon: 'MenuIcon' }, 25 | }, 26 | { 27 | path: '/excel/upload-style-excel', 28 | component: () => import('@/views/excel/exportStyleExcel/index.vue'), 29 | name: 'upload-style-excel', 30 | meta: { title: '自定义样式导出 Excel', icon: 'MenuIcon' }, 31 | }, 32 | { 33 | path: '/excel/upload-excel', 34 | component: () => import('@/views/excel/uploadExcel/index.vue'), 35 | name: 'upload-excel', 36 | meta: { title: '上传 Excel', icon: 'MenuIcon' }, 37 | }, 38 | { 39 | path: '/excel/zip', 40 | component: () => import('@/views/excel/zip/index.vue'), 41 | name: 'Zip', 42 | meta: { title: '导出 Zip', roles: ['other'], icon: 'MenuIcon' }, 43 | }, 44 | ], 45 | }, 46 | ] 47 | 48 | export default excelRouter 49 | -------------------------------------------------------------------------------- /src/views/echarts/simple/components/bar.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 66 | -------------------------------------------------------------------------------- /src/views/system/user/components/userSide.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 部门列表 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 55 | 56 | 59 | -------------------------------------------------------------------------------- /src/layout/components/Sidebar/components/Logo.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Vue Admin Perfect 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 58 | -------------------------------------------------------------------------------- /src/utils/resize.js: -------------------------------------------------------------------------------- 1 | import { debounce } from '@/utils/index.js' 2 | 3 | export default { 4 | data() { 5 | return { 6 | $_sidebarElm: null, 7 | $_resizeHandler: null, 8 | } 9 | }, 10 | mounted() { 11 | this.initListener() 12 | }, 13 | activated() { 14 | if (!this.$_resizeHandler) { 15 | // avoid duplication init 16 | this.initListener() 17 | } 18 | 19 | // when keep-alive chart activated, auto resize 20 | this.resize() 21 | }, 22 | beforeDestroy() { 23 | this.destroyListener() 24 | }, 25 | deactivated() { 26 | this.destroyListener() 27 | }, 28 | methods: { 29 | // use $_ for mixins properties 30 | // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential 31 | $_sidebarResizeHandler(e) { 32 | if (e.propertyName === 'width') { 33 | this.$_resizeHandler() 34 | } 35 | }, 36 | initListener() { 37 | this.$_resizeHandler = debounce(() => { 38 | this.resize() 39 | }, 100) 40 | window.addEventListener('resize', this.$_resizeHandler) 41 | 42 | this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] 43 | this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) 44 | }, 45 | destroyListener() { 46 | window.removeEventListener('resize', this.$_resizeHandler) 47 | this.$_resizeHandler = null 48 | 49 | this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) 50 | }, 51 | resize() { 52 | const { chart } = this 53 | chart && chart.resize() 54 | }, 55 | }, 56 | } 57 | -------------------------------------------------------------------------------- /src/store/modules/user.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | 3 | export const useUserStore = defineStore({ 4 | // id: 必须的,在所有 Store 中唯一 5 | id: 'userState', 6 | // state: 返回对象的函数 7 | state: () => ({ 8 | // 登录token 9 | token: null, 10 | // 登录用户信息 11 | userInfo: {}, 12 | // 角色 13 | roles: localStorage.roles ? JSON.parse(localStorage.roles) : [], 14 | }), 15 | getters: {}, 16 | // 可以同步 也可以异步 17 | actions: { 18 | // 登录 19 | login(userInfo) { 20 | const { username, password } = userInfo 21 | return new Promise(async (resolve, reject) => { 22 | this.token = username 23 | this.userInfo = userInfo 24 | await this.getRoles() 25 | resolve(username) 26 | }) 27 | }, 28 | // 获取用户授权角色信息,实际应用中 可以通过token通过请求接口在这里获取用户信息 29 | getRoles() { 30 | return new Promise((resolve, reject) => { 31 | // 获取权限列表 默认就是超级管理员,因为没有进行接口请求 写死 32 | this.roles = ['admin'] 33 | localStorage.roles = JSON.stringify(this.roles) 34 | resolve(this.roles) 35 | }) 36 | }, 37 | // 获取用户信息 ,如实际应用中 可以通过token通过请求接口在这里获取用户信息 38 | getInfo(roles) { 39 | return new Promise((resolve, reject) => { 40 | this.roles = roles 41 | resolve(roles) 42 | }) 43 | }, 44 | // 退出 45 | logout() { 46 | return new Promise((resolve, reject) => { 47 | this.token = null 48 | this.userInfo = {} 49 | this.roles = [] 50 | resolve(null) 51 | }) 52 | }, 53 | }, 54 | // 进行持久化存储 55 | persist: { 56 | // 本地存储的名称 57 | key: 'userState', 58 | //保存的位置 59 | storage: window.localStorage, //localstorage 60 | }, 61 | }) 62 | -------------------------------------------------------------------------------- /src/routers/modules/form.ts: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout/index.vue' 4 | 5 | const formRouter = [ 6 | { 7 | path: '/form', 8 | component: Layout, 9 | redirect: '/form/validateForm', 10 | name: 'form', 11 | alwaysShow: true, 12 | meta: { 13 | title: '超级表单', 14 | icon: 'Grape', 15 | }, 16 | children: [ 17 | { 18 | path: '/form/validateForm', 19 | component: () => import('@/views/form/validateForm/index.vue'), 20 | name: 'validateForm', 21 | meta: { title: '校验 Form', keepAlive: true, icon: 'MenuIcon' }, 22 | }, 23 | { 24 | path: '/form/advancedForm', 25 | component: () => import('@/views/form/advancedForm/index.vue'), 26 | name: 'advancedForm', 27 | meta: { title: '收缩 Form', icon: 'MenuIcon' }, 28 | }, 29 | { 30 | path: '/form/appendForm', 31 | component: () => import('@/views/form/appendForm/index.vue'), 32 | name: 'appendForm', 33 | meta: { title: '增删 Form', keepAlive: true, icon: 'MenuIcon' }, 34 | }, 35 | { 36 | path: '/form/moreForm', 37 | component: () => import('@/views/form/moreForm/index.vue'), 38 | name: 'moreForm', 39 | meta: { title: '多表单验证', keepAlive: true, icon: 'MenuIcon' }, 40 | }, 41 | { 42 | path: '/form/searchForm', 43 | component: () => import('@/views/form/searchForm/index.vue'), 44 | name: 'searchForm', 45 | meta: { title: '查询 Form', keepAlive: true, icon: 'MenuIcon' }, 46 | }, 47 | ], 48 | }, 49 | ] 50 | 51 | export default formRouter 52 | -------------------------------------------------------------------------------- /src/views/functionPage/informationList/components/SingleCheck.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 今日访问量 14 | 561 15 | 16 | 17 | 18 | 19 | 20 | 29 | 30 | 72 | -------------------------------------------------------------------------------- /src/views/echarts/simple/components/candlestick.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 68 | -------------------------------------------------------------------------------- /src/routers/modules/echarts.ts: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout/index.vue' 4 | 5 | const echartsRouter = [ 6 | { 7 | path: '/echarts', 8 | component: Layout, 9 | redirect: '/echarts/migration', 10 | name: 'echarts', 11 | meta: { 12 | title: 'Echarts', 13 | icon: 'trend-charts', 14 | roles: ['other'], 15 | }, 16 | children: [ 17 | { 18 | path: '/echarts/migration', 19 | component: () => import('@/views/echarts/migrationMap/index.vue'), 20 | name: 'migration', 21 | meta: { title: '迁徙图', roles: ['other'], icon: 'MenuIcon' }, 22 | }, 23 | 24 | { 25 | path: '/echarts/bar', 26 | component: () => import('@/views/echarts/barEcharts/index.vue'), 27 | name: 'bar', 28 | meta: { title: '柱状图', roles: ['other'], icon: 'MenuIcon' }, 29 | }, 30 | { 31 | path: '/echarts/graph', 32 | component: () => import('@/views/echarts/graphEcharts/index.vue'), 33 | name: 'graph', 34 | meta: { title: '雷达图', roles: ['other'], icon: 'MenuIcon' }, 35 | }, 36 | 37 | { 38 | path: '/echarts/pie', 39 | component: () => import('@/views/echarts/pieEcharts/index.vue'), 40 | name: 'pie', 41 | meta: { title: '饼图', roles: ['other'], icon: 'MenuIcon' }, 42 | }, 43 | { 44 | path: '/echarts/simple', 45 | component: () => import('@/views/echarts/simple/index.vue'), 46 | name: 'echarts-simple', 47 | meta: { title: '简单图表', roles: ['other'], icon: 'MenuIcon' }, 48 | }, 49 | ], 50 | }, 51 | ] 52 | 53 | export default echartsRouter 54 | -------------------------------------------------------------------------------- /src/store/modules/permission.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { asyncRoutes, constantRoutes, routerArray, notFoundRouter } from '@/routers/index' 3 | import { hasPermission, filterAsyncRoutes } from '@/utils/routers' 4 | import { filterKeepAlive, filterRoutes } from '@/utils/routers' 5 | export const usePermissionStore = defineStore({ 6 | // id: 必须的,在所有 Store 中唯一 7 | id: 'permissionState', 8 | // state: 返回对象的函数 9 | state: () => ({ 10 | // 路由 11 | routes: [], 12 | // 动态路由 13 | addRoutes: [], 14 | // 缓存路由 15 | cacheRoutes: {}, 16 | }), 17 | getters: { 18 | permission_routes: (state) => { 19 | return state.routes 20 | }, 21 | keepAliveRoutes: (state) => { 22 | return filterKeepAlive(asyncRoutes) 23 | }, 24 | }, 25 | // 可以同步 也可以异步 26 | actions: { 27 | // 生成路由 28 | generateRoutes(roles) { 29 | return new Promise((resolve) => { 30 | // 在这判断是否有权限,哪些角色拥有哪些权限 31 | let accessedRoutes 32 | if (roles && roles.length && !roles.includes('admin')) { 33 | accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) 34 | } else { 35 | accessedRoutes = asyncRoutes || [] 36 | } 37 | accessedRoutes = accessedRoutes.concat(notFoundRouter) 38 | this.routes = constantRoutes.concat(accessedRoutes) 39 | this.addRoutes = accessedRoutes 40 | resolve(accessedRoutes) 41 | }) 42 | }, 43 | // 清楚路由 44 | clearRoutes() { 45 | this.routes = [] 46 | this.addRoutes = [] 47 | this.cacheRoutes = [] 48 | }, 49 | getCacheRoutes() { 50 | this.cacheRoutes = filterKeepAlive(asyncRoutes) 51 | return this.cacheRoutes 52 | }, 53 | }, 54 | }) 55 | -------------------------------------------------------------------------------- /src/api/request.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios' 2 | import { ElMessage } from 'element-plus' 3 | import { useUserStore } from '@/store/modules/user' 4 | // 创建axios实例 进行基本参数配置 5 | const service = axios.create({ 6 | // 默认请求地址,根据环境的不同可在.env 文件中进行修改 7 | baseURL: import.meta.env.VITE_APP_BASE_API, 8 | // 设置接口访问超时时间 9 | timeout: 3000000, // request timeout, 10 | // 跨域时候允许携带凭证 11 | withCredentials: true, 12 | }) 13 | 14 | // request interceptor 接口请求拦截 15 | service.interceptors.request.use( 16 | (config: AxiosRequestConfig) => { 17 | /** 18 | * 用户登录之后获取服务端返回的token,后面每次请求都在请求头中带上token进行JWT校验 19 | * token 存储在本地储存中(storage)、vuex、pinia 20 | */ 21 | const userStore = useUserStore() 22 | const token: string = userStore.token 23 | // 自定义请求头 24 | if (token) { 25 | config.headers['Authorization'] = token 26 | } 27 | return config 28 | }, 29 | (error: AxiosError) => { 30 | // 请求错误,这里可以用全局提示框进行提示 31 | return Promise.reject(error) 32 | }, 33 | ) 34 | 35 | // response interceptor 接口响应拦截 36 | service.interceptors.response.use( 37 | (response: AxiosResponse) => { 38 | // 直接返回res,当然你也可以只返回res.data 39 | // 系统如果有自定义code也可以在这里处理 40 | return response 41 | }, 42 | (error: AxiosError) => { 43 | return Promise.reject(error) 44 | }, 45 | ) 46 | 47 | // /** 48 | // * @description 显示错误消息 49 | // * opt 传入参数 50 | // * err 错误信息 51 | // * type 消息类型 52 | // * duration 消息持续时间 53 | // */ 54 | // function showErrMessage(opt, err, type: any = 'error', duration = 5000) { 55 | // ElMessage({ 56 | // message: err.msg, 57 | // type: type, 58 | // duration: duration, 59 | // }); 60 | // } 61 | 62 | export default service 63 | -------------------------------------------------------------------------------- /src/components/CountTo/requestAnimationFrame.js: -------------------------------------------------------------------------------- 1 | let lastTime = 0 2 | const prefixes = 'webkit moz ms o'.split(' ') // 各浏览器前缀 3 | 4 | let requestAnimationFrame 5 | let cancelAnimationFrame 6 | 7 | const isServer = typeof window === 'undefined' 8 | if (isServer) { 9 | requestAnimationFrame = function () { 10 | return 11 | } 12 | cancelAnimationFrame = function () { 13 | return 14 | } 15 | } else { 16 | requestAnimationFrame = window.requestAnimationFrame 17 | cancelAnimationFrame = window.cancelAnimationFrame 18 | let prefix 19 | // 通过遍历各浏览器前缀,来得到requestAnimationFrame和cancelAnimationFrame在当前浏览器的实现形式 20 | for (let i = 0; i < prefixes.length; i++) { 21 | if (requestAnimationFrame && cancelAnimationFrame) { 22 | break 23 | } 24 | prefix = prefixes[i] 25 | requestAnimationFrame = requestAnimationFrame || window[prefix + 'RequestAnimationFrame'] 26 | cancelAnimationFrame = cancelAnimationFrame || window[prefix + 'CancelAnimationFrame'] || window[prefix + 'CancelRequestAnimationFrame'] 27 | } 28 | 29 | // 如果当前浏览器不支持requestAnimationFrame和cancelAnimationFrame,则会退到setTimeout 30 | if (!requestAnimationFrame || !cancelAnimationFrame) { 31 | requestAnimationFrame = function (callback) { 32 | const currTime = new Date().getTime() 33 | // 为了使setTimteout的尽可能的接近每秒60帧的效果 34 | const timeToCall = Math.max(0, 16 - (currTime - lastTime)) 35 | const id = window.setTimeout(() => { 36 | callback(currTime + timeToCall) 37 | }, timeToCall) 38 | lastTime = currTime + timeToCall 39 | return id 40 | } 41 | 42 | cancelAnimationFrame = function (id) { 43 | window.clearTimeout(id) 44 | } 45 | } 46 | } 47 | 48 | export { requestAnimationFrame, cancelAnimationFrame } 49 | -------------------------------------------------------------------------------- /src/views/other/svgIcon/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 图标的名称,svg 图标必须存储在 src/icons 目录下 25 | 图标的前缀,默认为 "icon-class" 26 | 图标的样式,默认样式为 { width: "1em", height: " 1em" } 27 | 28 | 29 | 30 | 31 | 32 | 35 | 36 | 39 | -------------------------------------------------------------------------------- /src/routers/modules/functionPage.ts: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout/index.vue' 4 | 5 | const functionPageRouter = [ 6 | { 7 | path: '/function-page', 8 | component: Layout, 9 | redirect: '/function-page/404', 10 | name: 'function-page', 11 | meta: { 12 | title: '功能页面', 13 | icon: 'ElementPlus', 14 | }, 15 | children: [ 16 | { 17 | path: '/function-page/tools', 18 | component: () => import('@/views/functionPage/tools/index.vue'), 19 | name: 'tools', 20 | meta: { title: '工具链集合', keepAlive: true, icon: 'MenuIcon' }, 21 | }, 22 | { 23 | path: '/function-page/404', 24 | component: () => import('@/views/errorPages/404.vue'), 25 | name: 'function-404', 26 | meta: { title: '404 页面', keepAlive: true, icon: 'MenuIcon' }, 27 | }, 28 | { 29 | path: '/function-page/403', 30 | component: () => import('@/views/errorPages/403.vue'), 31 | name: 'function-403', 32 | meta: { title: '403 页面', keepAlive: true, icon: 'MenuIcon' }, 33 | }, 34 | { 35 | path: '/function-page/fullscreen', 36 | component: () => import('@/views/functionPage/fullscreen/index.vue'), 37 | name: 'fullscreen', 38 | meta: { title: '元素 全屏', keepAlive: true, icon: 'MenuIcon' }, 39 | }, 40 | { 41 | path: '/function-page/information-list', 42 | component: () => import('@/views/functionPage/informationList/index.vue'), 43 | name: 'informationList', 44 | meta: { title: '信息列表', keepAlive: true, icon: 'MenuIcon' }, 45 | }, 46 | ], 47 | }, 48 | ] 49 | 50 | export default functionPageRouter 51 | -------------------------------------------------------------------------------- /src/icons/svg/exit-fullscreen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/tree.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/icons/svg/update.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/permission.ts: -------------------------------------------------------------------------------- 1 | import router from '@/routers/index' 2 | import NProgress from 'nprogress' 3 | import 'nprogress/nprogress.css' 4 | import { useUserStore } from '@/store/modules/user' 5 | import { usePermissionStore } from '@/store/modules/permission' 6 | 7 | NProgress.configure({ showSpinner: false }) // NProgress Configuration 8 | 9 | const whiteList = ['/login', '/auth-redirect'] // 设置白名单 10 | // 记录路由 11 | let hasRoles = true 12 | 13 | router.beforeEach(async (to, from, next) => { 14 | // 开启进度条 15 | NProgress.start() 16 | // 设置标题 17 | if (typeof to.meta.title === 'string') { 18 | document.title = to.meta.title || 'vue-admin-perfect' 19 | } 20 | 21 | const UserStore = useUserStore() 22 | // 确定用户是否已登录过,存在Token 23 | const hasToken = UserStore.token 24 | 25 | if (hasToken) { 26 | if (to.path === '/login') { 27 | // 如果已登录,请重定向到主页 28 | next({ path: '/' }) 29 | } else { 30 | try { 31 | const PermissionStore = usePermissionStore() 32 | // 路由添加进去了没有及时更新 需要重新进去一次拦截 33 | if (!PermissionStore.routes.length) { 34 | // 获取权限列表进行接口访问 因为这里页面要切换权限 35 | const accessRoutes = await PermissionStore.generateRoutes(UserStore.roles) 36 | hasRoles = false 37 | accessRoutes.forEach((item) => router.addRoute(item)) // 动态添加访问路由表 38 | next({ ...to, replace: true }) // // 这里相当于push到一个页面 不在进入路由拦截 39 | } else { 40 | next() // // 如果不传参数就会重新执行路由拦截,重新进到这里 41 | } 42 | } catch (error) { 43 | next(`/login?redirect=${to.path}`) 44 | } 45 | } 46 | } else { 47 | if (whiteList.indexOf(to.path) !== -1) { 48 | next() 49 | } else { 50 | next(`/login?redirect=${to.path}`) 51 | } 52 | } 53 | }) 54 | 55 | router.afterEach(() => { 56 | NProgress.done() 57 | }) 58 | -------------------------------------------------------------------------------- /src/views/form/moreForm/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 14 | 53 | 54 | 57 | -------------------------------------------------------------------------------- /src/components/SearchForm/components/BaseFormItem.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 43 | 48 | 49 | -------------------------------------------------------------------------------- /src/layout/components/Sidebar/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 49 | 50 | 55 | -------------------------------------------------------------------------------- /src/views/dataScreen/components/full-screen-container.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 50 | 51 | 65 | -------------------------------------------------------------------------------- /src/views/form/moreForm/components/FormThree.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 42 | -------------------------------------------------------------------------------- /src/views/form/moreForm/components/FormTwo.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 44 | -------------------------------------------------------------------------------- /src/views/echarts/simple/components/line.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /src/views/other/iconfont/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 40 | 41 | 44 | -------------------------------------------------------------------------------- /src/hooks/useResizeHandler.ts: -------------------------------------------------------------------------------- 1 | import { useSettingStore } from '@/store/modules/setting' 2 | import { computed, onMounted, onUnmounted, watch } from 'vue' 3 | import { useRoute } from 'vue-router' 4 | 5 | const { body } = document 6 | 7 | const WIDTH = 800 // refer to Bootstrap's responsive design 8 | const MAX_WIDTH = 1200 9 | 10 | export const useResizeHandler = () => { 11 | const SettingStore = useSettingStore() 12 | const route = useRoute() 13 | const device = computed(() => { 14 | return SettingStore.device 15 | }) 16 | function $_isMobile() { 17 | const rect = body.getBoundingClientRect() 18 | return rect.width - 1 < WIDTH 19 | } 20 | 21 | function collapse() { 22 | const rect = body.getBoundingClientRect() 23 | if (rect.width - 1 > MAX_WIDTH) { 24 | return true 25 | } else { 26 | return false 27 | } 28 | } 29 | 30 | function $_resizeHandler() { 31 | if (!document.hidden) { 32 | // bool型,表示页面是否处于隐藏状态。页面隐藏包括页面在后台标签页或者浏览器最小化 33 | const isMobile = $_isMobile() 34 | const isCollapse = collapse() 35 | SettingStore.toggleDevice(isMobile ? 'mobile' : 'desktop') 36 | 37 | if (isMobile) { 38 | SettingStore.closeSideBar({ withoutAnimation: true }) 39 | } 40 | 41 | if (!isMobile) { 42 | SettingStore.setCollapse(isCollapse) 43 | } 44 | } 45 | } 46 | onMounted(() => { 47 | const isMobile = $_isMobile() 48 | if (isMobile) { 49 | SettingStore.toggleDevice('mobile') 50 | SettingStore.closeSideBar({ withoutAnimation: true }) 51 | } 52 | window.addEventListener('resize', $_resizeHandler) 53 | 54 | watch(route, () => { 55 | if (device.value === 'mobile' && SettingStore.isCollapse) { 56 | SettingStore.closeSideBar({ withoutAnimation: false }) 57 | } 58 | }) 59 | }) 60 | 61 | onUnmounted(() => { 62 | window.removeEventListener('resize', $_resizeHandler) 63 | }) 64 | 65 | return { device } 66 | } 67 | -------------------------------------------------------------------------------- /src/layout/LayoutHorizontal/HeaderHorizontal/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 58 | 59 | 62 | -------------------------------------------------------------------------------- /src/store/modules/setting.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { PRIMARY_COLOR } from '../../config' 3 | 4 | export const useSettingStore = defineStore({ 5 | // id: 必须的,在所有 Store 中唯一 6 | id: 'settingState', 7 | // state: 返回对象的函数 8 | state: () => ({ 9 | // menu 是否收缩 10 | isCollapse: true, 11 | // 12 | withoutAnimation: false, 13 | device: 'desktop', 14 | // 刷新当前页 15 | isReload: true, 16 | // 主题设置 17 | themeConfig: { 18 | // 显示设置 19 | showSetting: false, 20 | // 菜单展示模式 默认 vertical horizontal / vertical /columns 21 | mode: 'vertical', 22 | // tagsView 是否展示 默认展示 23 | showTag: true, 24 | // 页脚 25 | footer: true, 26 | // 深色模式 切换暗黑模式 27 | isDark: false, 28 | // 显示侧边栏Logo 29 | showLogo: true, 30 | // 主题颜色 31 | primary: PRIMARY_COLOR, 32 | // element组件大小 33 | globalComSize: 'default', 34 | // 是否只保持一个子菜单的展开 35 | uniqueOpened: true, 36 | // 固定header 37 | fixedHeader: true, 38 | // 灰色模式 39 | gray: false, 40 | // 色弱模式 41 | weak: false, 42 | }, 43 | }), 44 | getters: {}, 45 | // 可以同步 也可以异步 46 | actions: { 47 | // 设置主题 48 | setThemeConfig({ key, val }) { 49 | this.themeConfig[key] = val 50 | }, 51 | // 切换 Collapse 52 | setCollapse(value) { 53 | this.isCollapse = value 54 | this.withoutAnimation = false 55 | }, 56 | // 关闭侧边栏 57 | closeSideBar({ withoutAnimation }) { 58 | this.isCollapse = false 59 | this.withoutAnimation = withoutAnimation 60 | }, 61 | toggleDevice(device) { 62 | this.device = device 63 | }, 64 | // 刷新 65 | setReload() { 66 | this.isReload = false 67 | setTimeout(() => { 68 | this.isReload = true 69 | }, 50) 70 | }, 71 | }, 72 | // 这部分数据不需要存储 73 | // persist: { 74 | // // 本地存储的名称 75 | // key: "settingState", 76 | // //保存的位置 77 | // storage: window.localStorage,//localstorage 78 | // }, 79 | }) 80 | -------------------------------------------------------------------------------- /src/views/other/cardDrag/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 还原 5 | 获取数据 6 | 7 | 8 | 28 | 29 | 30 | 60 | 61 | 64 | -------------------------------------------------------------------------------- /src/views/form/moreForm/components/FormOne.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 47 | -------------------------------------------------------------------------------- /src/views/table/ComprehensiveTable/constants.tsx: -------------------------------------------------------------------------------- 1 | export const columns = [ 2 | { 3 | type: 'selection', 4 | span: 8, 5 | fixed: 'left', 6 | }, 7 | { 8 | name: 'name', 9 | label: '姓名', 10 | search: true, 11 | valueType: 'input', 12 | span: 8, 13 | attrs: { 14 | placeholder: '请输入', 15 | }, 16 | }, 17 | { 18 | name: 'age', 19 | label: '年龄', 20 | align: 'right', 21 | 22 | span: 8, 23 | }, 24 | { 25 | name: 'sex', 26 | label: '性别', 27 | slot: true, 28 | search: true, 29 | span: 8, 30 | options: [ 31 | { 32 | value: 1, 33 | label: '男', 34 | }, 35 | { 36 | value: 0, 37 | label: '女', 38 | }, 39 | ], 40 | valueType: 'select', 41 | }, 42 | { 43 | name: 'price', 44 | label: '价格', 45 | search: true, 46 | sortable: true, 47 | valueType: 'input', 48 | span: 8, 49 | attrs: { 50 | placeholder: '请输入', 51 | }, 52 | }, 53 | { 54 | name: 'admin', 55 | label: '账号', 56 | search: true, 57 | valueType: 'input', 58 | span: 8, 59 | attrs: { 60 | placeholder: '请输入', 61 | }, 62 | }, 63 | { 64 | name: 'address', 65 | label: '地址', 66 | search: true, 67 | valueType: 'input', 68 | width: 180, 69 | span: 8, 70 | attrs: { 71 | placeholder: '请输入', 72 | }, 73 | }, 74 | { 75 | name: 'date', 76 | label: '日期', 77 | sorter: true, 78 | search: true, 79 | valueType: 'input', 80 | span: 8, 81 | attrs: { 82 | placeholder: '请输入', 83 | }, 84 | }, 85 | { 86 | name: 'province', 87 | label: '省份', 88 | }, 89 | { 90 | name: 'city', 91 | label: '城市', 92 | }, 93 | { 94 | name: 'zip', 95 | label: '邮编', 96 | }, 97 | { 98 | name: 'operation', 99 | slot: true, 100 | fixed: 'right', 101 | label: '操作', 102 | width: 200, 103 | }, 104 | ] 105 | -------------------------------------------------------------------------------- /src/views/echarts/simple/components/scatter.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 85 | -------------------------------------------------------------------------------- /src/components/WangEdior/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 | 63 | 76 | -------------------------------------------------------------------------------- /src/views/excel/exportExcel/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 导出格式 7 | 8 | 9 | 10 | 11 | 12 | 13 | 导出 Excel 14 | 15 | 16 | 25 | 26 | 27 | 28 | 57 | 58 | 61 | -------------------------------------------------------------------------------- /src/layout/components/TagsView/components/MoreButton.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 更多 5 | 6 | 7 | 8 | 9 | 刷新当页 12 | 关闭当前 15 | 关闭其他 18 | 关闭所有 21 | 22 | 23 | 24 | 25 | 54 | 64 | -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'iconfont'; /* Project id 3641732 */ 3 | src: url('./iconfont.woff2?t=1663216428515') format('woff2'), url('./iconfont.woff?t=1663216428515') format('woff'), 4 | url('./iconfont.ttf?t=1663216428515') format('truetype'); 5 | } 6 | 7 | .iconfont { 8 | font-family: 'iconfont' !important; 9 | font-size: 16px; 10 | font-style: normal; 11 | -webkit-font-smoothing: antialiased; 12 | -moz-osx-font-smoothing: grayscale; 13 | } 14 | 15 | .icon-yin:before { 16 | content: '\e6a0'; 17 | } 18 | 19 | .icon-dabaoyu:before { 20 | content: '\e6a7'; 21 | } 22 | 23 | .icon-shuaxin1:before { 24 | content: '\e627'; 25 | } 26 | 27 | .icon-shuaxin:before { 28 | content: '\e629'; 29 | } 30 | 31 | .icon-duoyun-2-copy:before { 32 | content: '\e68d'; 33 | } 34 | 35 | .icon-duoyun-1:before { 36 | content: '\e679'; 37 | } 38 | 39 | .icon-daxue:before { 40 | content: '\e67a'; 41 | } 42 | 43 | .icon-dayu:before { 44 | content: '\e67b'; 45 | } 46 | 47 | .icon-feng:before { 48 | content: '\e67c'; 49 | } 50 | 51 | .icon-duoyun-3:before { 52 | content: '\e67d'; 53 | } 54 | 55 | .icon-duoyun-2:before { 56 | content: '\e67e'; 57 | } 58 | 59 | .icon-leiyujiaojia:before { 60 | content: '\e67f'; 61 | } 62 | 63 | .icon-duoyun:before { 64 | content: '\e680'; 65 | } 66 | 67 | .icon-zhongyu:before { 68 | content: '\e681'; 69 | } 70 | 71 | .icon-wu:before { 72 | content: '\e682'; 73 | } 74 | 75 | .icon-xiaoyu:before { 76 | content: '\e683'; 77 | } 78 | 79 | .icon-xiaoxue:before { 80 | content: '\e684'; 81 | } 82 | 83 | .icon-shandian:before { 84 | content: '\e685'; 85 | } 86 | 87 | .icon-xue:before { 88 | content: '\e686'; 89 | } 90 | 91 | .icon-zhongxue:before { 92 | content: '\e687'; 93 | } 94 | 95 | .icon-yangchen:before { 96 | content: '\e688'; 97 | } 98 | 99 | .icon-yueliang:before { 100 | content: '\e689'; 101 | } 102 | 103 | .icon-yujiaxue:before { 104 | content: '\e68a'; 105 | } 106 | 107 | .icon-qing:before { 108 | content: '\e68b'; 109 | } 110 | 111 | .icon-mai:before { 112 | content: '\e68c'; 113 | } 114 | -------------------------------------------------------------------------------- /src/views/form/validateForm/components/Upload.vue: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 73 | -------------------------------------------------------------------------------- /src/icons/svg/take-over.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/echarts/simple/components/pie.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 89 | -------------------------------------------------------------------------------- /src/icons/svg/dashboard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/echarts/simple/components/graph.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 91 | --------------------------------------------------------------------------------