From 3c59102ecf0a051ff0a4b92e96fa02c5f4dbbdb2 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 2 Jul 2024 16:43:41 +0800 Subject: [PATCH] =?UTF-8?q?remove=20=E5=8E=BB=E9=99=A4=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .husky/commit-msg | 8 - .husky/common.sh | 9 - .husky/pre-commit | 10 - src/api/common/Captcha.ts | 2 +- src/api/demo/account.ts | 16 -- src/api/demo/cascader.ts | 8 - src/api/demo/error.ts | 12 -- src/api/demo/model/accountModel.ts | 7 - src/api/demo/model/areaModel.ts | 12 -- src/api/demo/model/optionsModel.ts | 15 -- src/api/demo/model/systemModel.ts | 75 -------- src/api/demo/model/tableModel.ts | 20 -- src/api/demo/select.ts | 11 -- src/api/demo/system.ts | 38 ---- src/api/demo/table.ts | 20 -- src/api/demo/tree.ts | 10 - src/api/model/baseModel.ts | 9 - src/assets/icons/download-count.svg | 1 - src/assets/icons/dynamic-avatar-1.svg | 1 - src/assets/icons/dynamic-avatar-2.svg | 1 - src/assets/icons/dynamic-avatar-3.svg | 1 - src/assets/icons/dynamic-avatar-4.svg | 1 - src/assets/icons/dynamic-avatar-5.svg | 1 - src/assets/icons/dynamic-avatar-6.svg | 1 - src/assets/icons/moon.svg | 16 -- src/assets/icons/sun.svg | 42 ----- src/assets/icons/test.svg | 21 --- src/assets/icons/total-sales.svg | 1 - src/assets/icons/transaction.svg | 1 - src/assets/icons/visit-count.svg | 1 - src/assets/images/demo.png | Bin 33342 -> 0 bytes src/assets/svg/illustration.svg | 1 - src/assets/svg/preview/p-rotate.svg | 1 - src/assets/svg/preview/resume.svg | 1 - src/assets/svg/preview/scale.svg | 1 - src/assets/svg/preview/unrotate.svg | 1 - src/assets/svg/preview/unscale.svg | 1 - src/hooks/setting/useRootSetting.ts | 3 - .../default/header/components/ErrorAction.vue | 31 --- .../default/header/components/index.ts | 2 - src/layouts/default/header/index.vue | 40 +++- src/logics/error-handle/index.ts | 177 ------------------ src/main.ts | 5 - src/router/routes/basic.ts | 24 --- src/router/routes/modules/dashboard.ts | 8 - src/settings/projectSetting.ts | 3 - src/store/modules/errorLog.ts | 74 -------- src/store/modules/permission.ts | 3 +- src/utils/http/axios/index.ts | 3 - .../workbench/components/DynamicInfo.vue | 31 --- .../workbench/components/ProjectCard.vue | 24 --- .../workbench/components/QuickNav.vue | 15 -- .../workbench/components/SaleRadar.vue | 94 ---------- .../workbench/components/WorkbenchHeader.vue | 33 ---- .../dashboard/workbench/components/data.ts | 156 --------------- src/views/dashboard/workbench/index.vue | 36 ---- src/views/sys/error-log/DetailModal.vue | 27 --- src/views/sys/error-log/data.tsx | 67 ------- src/views/sys/error-log/index.vue | 97 ---------- types/config.d.ts | 2 - 60 files changed, 33 insertions(+), 1299 deletions(-) delete mode 100755 .husky/commit-msg delete mode 100644 .husky/common.sh delete mode 100755 .husky/pre-commit delete mode 100644 src/api/demo/account.ts delete mode 100644 src/api/demo/cascader.ts delete mode 100644 src/api/demo/error.ts delete mode 100644 src/api/demo/model/accountModel.ts delete mode 100644 src/api/demo/model/areaModel.ts delete mode 100644 src/api/demo/model/optionsModel.ts delete mode 100644 src/api/demo/model/systemModel.ts delete mode 100644 src/api/demo/model/tableModel.ts delete mode 100644 src/api/demo/select.ts delete mode 100644 src/api/demo/system.ts delete mode 100644 src/api/demo/table.ts delete mode 100644 src/api/demo/tree.ts delete mode 100644 src/api/model/baseModel.ts delete mode 100644 src/assets/icons/download-count.svg delete mode 100644 src/assets/icons/dynamic-avatar-1.svg delete mode 100644 src/assets/icons/dynamic-avatar-2.svg delete mode 100644 src/assets/icons/dynamic-avatar-3.svg delete mode 100644 src/assets/icons/dynamic-avatar-4.svg delete mode 100644 src/assets/icons/dynamic-avatar-5.svg delete mode 100644 src/assets/icons/dynamic-avatar-6.svg delete mode 100644 src/assets/icons/moon.svg delete mode 100644 src/assets/icons/sun.svg delete mode 100644 src/assets/icons/test.svg delete mode 100644 src/assets/icons/total-sales.svg delete mode 100644 src/assets/icons/transaction.svg delete mode 100644 src/assets/icons/visit-count.svg delete mode 100644 src/assets/images/demo.png delete mode 100644 src/assets/svg/illustration.svg delete mode 100644 src/assets/svg/preview/p-rotate.svg delete mode 100644 src/assets/svg/preview/resume.svg delete mode 100644 src/assets/svg/preview/scale.svg delete mode 100644 src/assets/svg/preview/unrotate.svg delete mode 100644 src/assets/svg/preview/unscale.svg delete mode 100644 src/layouts/default/header/components/ErrorAction.vue delete mode 100644 src/logics/error-handle/index.ts delete mode 100644 src/store/modules/errorLog.ts delete mode 100644 src/views/dashboard/workbench/components/DynamicInfo.vue delete mode 100644 src/views/dashboard/workbench/components/ProjectCard.vue delete mode 100644 src/views/dashboard/workbench/components/QuickNav.vue delete mode 100644 src/views/dashboard/workbench/components/SaleRadar.vue delete mode 100644 src/views/dashboard/workbench/components/WorkbenchHeader.vue delete mode 100644 src/views/dashboard/workbench/components/data.ts delete mode 100644 src/views/dashboard/workbench/index.vue delete mode 100644 src/views/sys/error-log/DetailModal.vue delete mode 100644 src/views/sys/error-log/data.tsx delete mode 100644 src/views/sys/error-log/index.vue diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100755 index 274d2d8b..00000000 --- a/.husky/commit-msg +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -# shellcheck source=./_/husky.sh -. "$(dirname "$0")/_/husky.sh" - -PATH="/usr/local/bin:$PATH" - -npx --no-install commitlint --edit "$1" diff --git a/.husky/common.sh b/.husky/common.sh deleted file mode 100644 index 9d5129bd..00000000 --- a/.husky/common.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -command_exists () { - command -v "$1" >/dev/null 2>&1 -} - -# Workaround for Windows 10, Git Bash and Yarn -if command_exists winpty && test -t 1; then - exec < /dev/tty -fi diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 53685f44..00000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" -. "$(dirname "$0")/common.sh" - -[ -n "$CI" ] && exit 0 - -PATH="/usr/local/bin:$PATH" - -# Format and submit code according to lintstagedrc.js configuration -pnpm exec lint-staged diff --git a/src/api/common/Captcha.ts b/src/api/common/Captcha.ts index 4e13ca0a..c7abead6 100644 --- a/src/api/common/Captcha.ts +++ b/src/api/common/Captcha.ts @@ -2,7 +2,7 @@ import { defHttp } from '@/utils/http/axios' import { Result } from '#/axios' /** - * 获取文件预览地址 + * 获取验证码 */ export const imgCaptcha = () => { return defHttp.post>({ diff --git a/src/api/demo/account.ts b/src/api/demo/account.ts deleted file mode 100644 index 35d5c1fc..00000000 --- a/src/api/demo/account.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { defHttp } from '@/utils/http/axios' -import { GetAccountInfoModel } from './model/accountModel' - -enum Api { - ACCOUNT_INFO = '/account/getAccountInfo', - SESSION_TIMEOUT = '/user/sessionTimeout', - TOKEN_EXPIRED = '/user/tokenExpired', -} - -// Get personal center-basic settings - -export const accountInfoApi = () => defHttp.get({ url: Api.ACCOUNT_INFO }) - -export const sessionTimeoutApi = () => defHttp.post({ url: Api.SESSION_TIMEOUT }) - -export const tokenExpiredApi = () => defHttp.post({ url: Api.TOKEN_EXPIRED }) diff --git a/src/api/demo/cascader.ts b/src/api/demo/cascader.ts deleted file mode 100644 index 2960d77d..00000000 --- a/src/api/demo/cascader.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defHttp } from '@/utils/http/axios' -import { AreaModel, AreaParams } from '@/api/demo/model/areaModel' - -enum Api { - AREA_RECORD = '/cascader/getAreaRecord', -} - -export const areaRecord = (data: AreaParams) => defHttp.post({ url: Api.AREA_RECORD, data }) diff --git a/src/api/demo/error.ts b/src/api/demo/error.ts deleted file mode 100644 index c88ceb69..00000000 --- a/src/api/demo/error.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defHttp } from '@/utils/http/axios' - -enum Api { - // The address does not exist - Error = '/error', -} - -/** - * @description: Trigger ajax error - */ - -export const fireErrorApi = () => defHttp.get({ url: Api.Error }) diff --git a/src/api/demo/model/accountModel.ts b/src/api/demo/model/accountModel.ts deleted file mode 100644 index 06c48888..00000000 --- a/src/api/demo/model/accountModel.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface GetAccountInfoModel { - email: string - name: string - introduction: string - phone: string - address: string -} diff --git a/src/api/demo/model/areaModel.ts b/src/api/demo/model/areaModel.ts deleted file mode 100644 index ac40079b..00000000 --- a/src/api/demo/model/areaModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface AreaModel { - id: string - code: string - parentCode: string - name: string - levelType: number - [key: string]: string | number -} - -export interface AreaParams { - parentCode: string -} diff --git a/src/api/demo/model/optionsModel.ts b/src/api/demo/model/optionsModel.ts deleted file mode 100644 index 463fa0be..00000000 --- a/src/api/demo/model/optionsModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { BasicFetchResult } from '@/api/model/baseModel' - -export interface DemoOptionsItem { - name: string - id: string -} - -export interface selectParams { - id: number | string -} - -/** - * @description: Request list return value - */ -export type DemoOptionsGetResultModel = BasicFetchResult diff --git a/src/api/demo/model/systemModel.ts b/src/api/demo/model/systemModel.ts deleted file mode 100644 index e543ffe0..00000000 --- a/src/api/demo/model/systemModel.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { BasicPageParams, BasicFetchResult } from '@/api/model/baseModel' - -export type AccountParams = BasicPageParams & { - account?: string - nickname?: string - [key: string]: any -} - -export type RoleParams = { - roleName?: string - status?: string -} - -export type RolePageParams = BasicPageParams & RoleParams - -export type DeptParams = { - deptName?: string - status?: string -} - -export type MenuParams = { - menuName?: string - status?: string -} - -export interface AccountListItem { - id: string - account: string - email: string - nickname: string - role: number - createTime: string - remark: string - status: number -} - -export interface DeptListItem { - id: string - orderNo: string - createTime: string - remark: string - status: number -} - -export interface MenuListItem { - id: string - orderNo: string - createTime: string - status: number - icon: string - component: string - permission: string -} - -export interface RoleListItem { - id: string - roleName: string - roleValue: string - status: number - orderNo: string - createTime: string -} - -/** - * @description: Request list return value - */ -export type AccountListGetResultModel = BasicFetchResult - -export type DeptListGetResultModel = BasicFetchResult - -export type MenuListGetResultModel = BasicFetchResult - -export type RolePageListGetResultModel = BasicFetchResult - -export type RoleListGetResultModel = RoleListItem[] diff --git a/src/api/demo/model/tableModel.ts b/src/api/demo/model/tableModel.ts deleted file mode 100644 index 8d8ea37f..00000000 --- a/src/api/demo/model/tableModel.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { BasicPageParams, BasicFetchResult } from '@/api/model/baseModel' -/** - * @description: Request list interface parameters - */ -export type DemoParams = Partial - -export interface DemoListItem { - id: string - beginTime: string - endTime: string - address: string - name: string - no: number - status: number -} - -/** - * @description: Request list return value - */ -export type DemoListGetResultModel = BasicFetchResult diff --git a/src/api/demo/select.ts b/src/api/demo/select.ts deleted file mode 100644 index a0075fe3..00000000 --- a/src/api/demo/select.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defHttp } from '@/utils/http/axios' -import { DemoOptionsItem, selectParams } from './model/optionsModel' - -enum Api { - OPTIONS_LIST = '/select/getDemoOptions', -} - -/** - * @description: Get sample options value - */ -export const optionsListApi = (params?: selectParams) => defHttp.get({ url: Api.OPTIONS_LIST, params }) diff --git a/src/api/demo/system.ts b/src/api/demo/system.ts deleted file mode 100644 index fa0e966b..00000000 --- a/src/api/demo/system.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { - AccountParams, - DeptListItem, - MenuParams, - RoleParams, - RolePageParams, - MenuListGetResultModel, - DeptListGetResultModel, - AccountListGetResultModel, - RolePageListGetResultModel, - RoleListGetResultModel, -} from './model/systemModel' -import { defHttp } from '@/utils/http/axios' - -enum Api { - AccountList = '/system/getAccountList', - IsAccountExist = '/system/accountExist', - DeptList = '/system/getDeptList', - setRoleStatus = '/system/setRoleStatus', - MenuList = '/system/getMenuList', - RolePageList = '/system/getRoleListByPage', - GetAllRoleList = '/system/getAllRoleList', -} - -export const getAccountList = (params: AccountParams) => defHttp.get({ url: Api.AccountList, params }) - -export const getDeptList = (params?: DeptListItem) => defHttp.get({ url: Api.DeptList, params }) - -export const getMenuList = (params?: MenuParams) => defHttp.get({ url: Api.MenuList, params }) - -export const getRoleListByPage = (params?: RolePageParams) => defHttp.get({ url: Api.RolePageList, params }) - -export const getAllRoleList = (params?: RoleParams) => defHttp.get({ url: Api.GetAllRoleList, params }) - -export const setRoleStatus = (id: number, status: string) => defHttp.post({ url: Api.setRoleStatus, params: { id, status } }) - -export const isAccountExist = (account: string) => - defHttp.post({ url: Api.IsAccountExist, params: { account } }, { errorMessageMode: 'none' }) diff --git a/src/api/demo/table.ts b/src/api/demo/table.ts deleted file mode 100644 index 840b660d..00000000 --- a/src/api/demo/table.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { defHttp } from '@/utils/http/axios' -import { DemoParams, DemoListGetResultModel } from './model/tableModel' - -enum Api { - DEMO_LIST = '/table/getDemoList', -} - -/** - * @description: Get sample list value - */ - -export const demoListApi = (params: DemoParams) => - defHttp.get({ - url: Api.DEMO_LIST, - params, - headers: { - // @ts-ignore - ignoreCancelToken: true, - }, - }) diff --git a/src/api/demo/tree.ts b/src/api/demo/tree.ts deleted file mode 100644 index 6b6624a0..00000000 --- a/src/api/demo/tree.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defHttp } from '@/utils/http/axios' - -enum Api { - TREE_OPTIONS_LIST = '/tree/getDemoOptions', -} - -/** - * @description: Get sample options value - */ -export const treeOptionsListApi = (params?: Recordable) => defHttp.get({ url: Api.TREE_OPTIONS_LIST, params }) diff --git a/src/api/model/baseModel.ts b/src/api/model/baseModel.ts deleted file mode 100644 index 076b9868..00000000 --- a/src/api/model/baseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface BasicPageParams { - page: number - pageSize: number -} - -export interface BasicFetchResult { - items: T[] - total: number -} diff --git a/src/assets/icons/download-count.svg b/src/assets/icons/download-count.svg deleted file mode 100644 index 1c951958..00000000 --- a/src/assets/icons/download-count.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 91 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-1.svg b/src/assets/icons/dynamic-avatar-1.svg deleted file mode 100644 index e1553e50..00000000 --- a/src/assets/icons/dynamic-avatar-1.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 15 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-2.svg b/src/assets/icons/dynamic-avatar-2.svg deleted file mode 100644 index c4c17223..00000000 --- a/src/assets/icons/dynamic-avatar-2.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 16 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-3.svg b/src/assets/icons/dynamic-avatar-3.svg deleted file mode 100644 index 81145f9b..00000000 --- a/src/assets/icons/dynamic-avatar-3.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 17 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-4.svg b/src/assets/icons/dynamic-avatar-4.svg deleted file mode 100644 index e586ed4e..00000000 --- a/src/assets/icons/dynamic-avatar-4.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 120 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-5.svg b/src/assets/icons/dynamic-avatar-5.svg deleted file mode 100644 index 746e4b88..00000000 --- a/src/assets/icons/dynamic-avatar-5.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 110 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-6.svg b/src/assets/icons/dynamic-avatar-6.svg deleted file mode 100644 index b2432f22..00000000 --- a/src/assets/icons/dynamic-avatar-6.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 100 \ No newline at end of file diff --git a/src/assets/icons/moon.svg b/src/assets/icons/moon.svg deleted file mode 100644 index e6667f0d..00000000 --- a/src/assets/icons/moon.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - diff --git a/src/assets/icons/sun.svg b/src/assets/icons/sun.svg deleted file mode 100644 index a3997cbf..00000000 --- a/src/assets/icons/sun.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/icons/test.svg b/src/assets/icons/test.svg deleted file mode 100644 index 244252dd..00000000 --- a/src/assets/icons/test.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - Icon1@3x - Created with Sketch. - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/assets/icons/total-sales.svg b/src/assets/icons/total-sales.svg deleted file mode 100644 index eff79640..00000000 --- a/src/assets/icons/total-sales.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 500 \ No newline at end of file diff --git a/src/assets/icons/transaction.svg b/src/assets/icons/transaction.svg deleted file mode 100644 index 7ba9e2f0..00000000 --- a/src/assets/icons/transaction.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 480% \ No newline at end of file diff --git a/src/assets/icons/visit-count.svg b/src/assets/icons/visit-count.svg deleted file mode 100644 index ba2a3061..00000000 --- a/src/assets/icons/visit-count.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 510 \ No newline at end of file diff --git a/src/assets/images/demo.png b/src/assets/images/demo.png deleted file mode 100644 index 1a45c9835b7b2c708c114b04fb445e6ef00d8827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33342 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 e@8|2lQ1vG(gBQr1xX^F_0000Asset 336 \ No newline at end of file diff --git a/src/assets/svg/preview/p-rotate.svg b/src/assets/svg/preview/p-rotate.svg deleted file mode 100644 index 5153a816..00000000 --- a/src/assets/svg/preview/p-rotate.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/assets/svg/preview/resume.svg b/src/assets/svg/preview/resume.svg deleted file mode 100644 index 0e86c5f6..00000000 --- a/src/assets/svg/preview/resume.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/assets/svg/preview/scale.svg b/src/assets/svg/preview/scale.svg deleted file mode 100644 index 1f7adaee..00000000 --- a/src/assets/svg/preview/scale.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/assets/svg/preview/unrotate.svg b/src/assets/svg/preview/unrotate.svg deleted file mode 100644 index e4708be1..00000000 --- a/src/assets/svg/preview/unrotate.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/assets/svg/preview/unscale.svg b/src/assets/svg/preview/unscale.svg deleted file mode 100644 index 1359b34c..00000000 --- a/src/assets/svg/preview/unscale.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/hooks/setting/useRootSetting.ts b/src/hooks/setting/useRootSetting.ts index 8ff37abb..c92e08b3 100644 --- a/src/hooks/setting/useRootSetting.ts +++ b/src/hooks/setting/useRootSetting.ts @@ -28,8 +28,6 @@ export function useRootSetting() { const getShowSettingButton = computed(() => appStore.getProjectConfig.showSettingButton) - const getUseErrorHandle = computed(() => appStore.getProjectConfig.useErrorHandle) - const getShowFooter = computed(() => appStore.getProjectConfig.showFooter) const getShowBreadCrumb = computed(() => appStore.getProjectConfig.showBreadCrumb) @@ -74,7 +72,6 @@ export function useRootSetting() { getCanEmbedIFramePage, getPermissionMode, getShowLogo, - getUseErrorHandle, getShowBreadCrumb, getShowBreadCrumbIcon, getUseOpenBackTop, diff --git a/src/layouts/default/header/components/ErrorAction.vue b/src/layouts/default/header/components/ErrorAction.vue deleted file mode 100644 index 556fc0de..00000000 --- a/src/layouts/default/header/components/ErrorAction.vue +++ /dev/null @@ -1,31 +0,0 @@ - - diff --git a/src/layouts/default/header/components/index.ts b/src/layouts/default/header/components/index.ts index dac055fa..d399446d 100644 --- a/src/layouts/default/header/components/index.ts +++ b/src/layouts/default/header/components/index.ts @@ -9,6 +9,4 @@ export const LayoutBreadcrumb = createAsyncComponent(() => import('./Breadcrumb. export const Notify = createAsyncComponent(() => import('./notify/index.vue')) -export const ErrorAction = createAsyncComponent(() => import('./ErrorAction.vue')) - export { FullScreen } diff --git a/src/layouts/default/header/index.vue b/src/layouts/default/header/index.vue index c2fe4ddc..a97621ac 100644 --- a/src/layouts/default/header/index.vue +++ b/src/layouts/default/header/index.vue @@ -3,9 +3,16 @@
- + @@ -15,7 +22,12 @@
- +
@@ -23,13 +35,16 @@
- - - + @@ -55,7 +70,7 @@ import LayoutMenu from '../menu/index.vue' import LayoutTrigger from '../trigger/index.vue' - import { ErrorAction, FullScreen, LayoutBreadcrumb, Notify, UserDropDown } from './components' + import { FullScreen, LayoutBreadcrumb, Notify, UserDropDown } from './components' const SettingDrawer = createAsyncComponent(() => import('@/layouts/default/setting/index.vue'), { loading: true, @@ -66,8 +81,15 @@ fixed: propTypes.bool, }) const { prefixCls } = useDesign('layout-header') - const { getShowTopMenu, getShowHeaderTrigger, getSplit, getIsMixMode, getMenuWidth, getIsMixSidebar } = useMenuSetting() - const { getUseErrorHandle, getShowSettingButton, getSettingButtonPosition } = useRootSetting() + const { + getShowTopMenu, + getShowHeaderTrigger, + getSplit, + getIsMixMode, + getMenuWidth, + getIsMixSidebar, + } = useMenuSetting() + const { getShowSettingButton, getSettingButtonPosition } = useRootSetting() const { getHeaderTheme, diff --git a/src/logics/error-handle/index.ts b/src/logics/error-handle/index.ts deleted file mode 100644 index aebfc56d..00000000 --- a/src/logics/error-handle/index.ts +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Used to configure the global error handling function, which can monitor vue errors, script errors, static resource errors and Promise errors - */ - -import type { ErrorLogInfo } from '#/store' - -import { useErrorLogStoreWithOut } from '@/store/modules/errorLog' - -import { ErrorTypeEnum } from '@/enums/exceptionEnum' -import { App } from 'vue' -import projectSetting from '@/settings/projectSetting' - -/** - * Handling error stack information - * @param error - */ -function processStackMsg(error: Error) { - if (!error.stack) { - return '' - } - let stack = error.stack - .replace(/\n/gi, '') // Remove line breaks to save the size of the transmitted content - .replace(/\bat\b/gi, '@') // At in chrome, @ in ff - .split('@') // Split information with @ - .slice(0, 9) // The maximum stack length (Error.stackTraceLimit = 10), so only take the first 10 - .map((v) => v.replace(/^\s*|\s*$/g, '')) // Remove extra spaces - .join('~') // Manually add separators for later display - .replace(/\?[^:]+/gi, '') // Remove redundant parameters of js file links (?x=1 and the like) - const msg = error.toString() - if (stack.indexOf(msg) < 0) { - stack = msg + '@' + stack - } - return stack -} - -/** - * get comp name - * @param vm - */ -function formatComponentName(vm: any) { - if (vm.$root === vm) { - return { - name: 'root', - path: 'root', - } - } - - const options = vm.$options as any - if (!options) { - return { - name: 'anonymous', - path: 'anonymous', - } - } - const name = options.name || options._componentTag - return { - name: name, - path: options.__file, - } -} - -/** - * Configure Vue error handling function - */ -function vueErrorHandler(err: unknown, vm: any, info: string) { - const errorLogStore = useErrorLogStoreWithOut() - const { name, path } = formatComponentName(vm) - errorLogStore.addErrorLogInfo({ - type: ErrorTypeEnum.VUE, - name, - file: path, - message: (err as Error).message, - stack: processStackMsg(err as Error), - detail: info, - url: window.location.href, - }) -} - -/** - * Configure script error handling function - */ -export function scriptErrorHandler(event: Event | string, source?: string, lineno?: number, colno?: number, error?: Error) { - if (event === 'Script error.' && !source) { - return false - } - const errorInfo: Partial = {} - colno = colno || (window.event && (window.event as any).errorCharacter) || 0 - errorInfo.message = event as string - if (error?.stack) { - errorInfo.stack = error.stack - } else { - errorInfo.stack = '' - } - const name = source ? source.substr(source.lastIndexOf('/') + 1) : 'script' - const errorLogStore = useErrorLogStoreWithOut() - errorLogStore.addErrorLogInfo({ - type: ErrorTypeEnum.SCRIPT, - name: name, - file: source as string, - detail: 'lineno' + lineno, - url: window.location.href, - ...(errorInfo as Pick), - }) - return true -} - -/** - * Configure Promise error handling function - */ -function registerPromiseErrorHandler() { - window.addEventListener( - 'unhandledrejection', - function (event) { - const errorLogStore = useErrorLogStoreWithOut() - errorLogStore.addErrorLogInfo({ - type: ErrorTypeEnum.PROMISE, - name: 'Promise Error!', - file: 'none', - detail: 'promise error!', - url: window.location.href, - stack: 'promise error!', - message: event.reason, - }) - }, - true, - ) -} - -/** - * Configure monitoring resource loading error handling function - */ -function registerResourceErrorHandler() { - // Monitoring resource loading error(img,script,css,and jsonp) - window.addEventListener( - 'error', - function (e: Event) { - const target = e.target ? e.target : (e.srcElement as any) - const errorLogStore = useErrorLogStoreWithOut() - errorLogStore.addErrorLogInfo({ - type: ErrorTypeEnum.RESOURCE, - name: 'Resource Error!', - file: (e.target || ({} as any)).currentSrc, - detail: JSON.stringify({ - tagName: target.localName, - html: target.outerHTML, - type: e.type, - }), - url: window.location.href, - stack: 'resource is not found', - message: (e.target || ({} as any)).localName + ' is load error', - }) - }, - true, - ) -} - -/** - * Configure global error handling - * @param app - */ -export function setupErrorHandle(app: App) { - const { useErrorHandle } = projectSetting - if (!useErrorHandle) { - return - } - // Vue exception monitoring; - app.config.errorHandler = vueErrorHandler - - // script error - window.onerror = scriptErrorHandler - - // promise exception - registerPromiseErrorHandler() - - // Static resource exception - registerResourceErrorHandler() -} diff --git a/src/main.ts b/src/main.ts index 4f67fc38..8c9de819 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,7 +10,6 @@ import { createApp } from 'vue' import { registerGlobComp } from '@/components/registerGlobComp' import { setupGlobDirectives } from '@/directives' import { setupI18n } from '@/locales/setupI18n' -import { setupErrorHandle } from '@/logics/error-handle' import { initAppConfigStore } from '@/logics/initAppConfig' import { router, setupRouter } from '@/router' import { setupRouterGuard } from '@/router/guard' @@ -51,10 +50,6 @@ async function bootstrap() { // 注册全局指令 setupGlobDirectives(app) - // Configure global error handling - // 配置全局错误处理 - setupErrorHandle(app) - // https://next.router.vuejs.org/api/#isready // await router.isReady(); diff --git a/src/router/routes/basic.ts b/src/router/routes/basic.ts index 18723ba8..9309b08a 100644 --- a/src/router/routes/basic.ts +++ b/src/router/routes/basic.ts @@ -47,27 +47,3 @@ export const REDIRECT_ROUTE: AppRouteRecordRaw = { }, ], } - -export const ERROR_LOG_ROUTE: AppRouteRecordRaw = { - path: '/error-log', - name: 'ErrorLog', - component: LAYOUT, - redirect: '/error-log/list', - meta: { - title: 'ErrorLog', - hideBreadcrumb: true, - hideChildrenInMenu: true, - }, - children: [ - { - path: 'list', - name: 'ErrorLogList', - component: () => import('@/views/sys/error-log/index.vue'), - meta: { - title: t('routes.basic.errorLogList'), - hideBreadcrumb: true, - currentActiveMenu: '/error-log', - }, - }, - ], -} diff --git a/src/router/routes/modules/dashboard.ts b/src/router/routes/modules/dashboard.ts index 909c420c..431a5da2 100644 --- a/src/router/routes/modules/dashboard.ts +++ b/src/router/routes/modules/dashboard.ts @@ -23,14 +23,6 @@ const Dashboard: AppRouteModule = { title: t('routes.dashboard.analysis'), }, }, - { - path: 'workbench', - name: 'Workbench', - component: () => import('@/views/dashboard/workbench/index.vue'), - meta: { - title: t('routes.dashboard.workbench'), - }, - }, ], } diff --git a/src/settings/projectSetting.ts b/src/settings/projectSetting.ts index 013e3b15..c1905fc9 100644 --- a/src/settings/projectSetting.ts +++ b/src/settings/projectSetting.ts @@ -165,9 +165,6 @@ const setting: ProjectConfig = { // Whether to show the breadcrumb icon showBreadCrumbIcon: false, - // Use error-handler-plugin - useErrorHandle: false, - // 是否打开返回顶部 useOpenBackTop: true, diff --git a/src/store/modules/errorLog.ts b/src/store/modules/errorLog.ts deleted file mode 100644 index 7bf68ec5..00000000 --- a/src/store/modules/errorLog.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { ErrorLogInfo } from '#/store' - -import { defineStore } from 'pinia' -import { store } from '@/store' - -import { formatToDateTime } from '@/utils/dateUtil' -import projectSetting from '@/settings/projectSetting' - -import { ErrorTypeEnum } from '@/enums/exceptionEnum' - -export interface ErrorLogState { - errorLogInfoList: Nullable - errorLogListCount: number -} - -export const useErrorLogStore = defineStore({ - id: 'app-error-log', - state: (): ErrorLogState => ({ - errorLogInfoList: null, - errorLogListCount: 0, - }), - getters: { - getErrorLogInfoList(state): ErrorLogInfo[] { - return state.errorLogInfoList || [] - }, - getErrorLogListCount(state): number { - return state.errorLogListCount - }, - }, - actions: { - addErrorLogInfo(info: ErrorLogInfo) { - const item = { - ...info, - time: formatToDateTime(new Date()), - } - this.errorLogInfoList = [item, ...(this.errorLogInfoList || [])] - this.errorLogListCount += 1 - }, - - setErrorLogListCount(count: number): void { - this.errorLogListCount = count - }, - - /** - * Triggered after ajax request error - * @param error - * @returns - */ - addAjaxErrorInfo(error) { - const { useErrorHandle } = projectSetting - if (!useErrorHandle) { - return - } - const errInfo: Partial = { - message: error.message, - type: ErrorTypeEnum.AJAX, - } - if (error.response) { - const { config: { url = '', data: params = '', method = 'get', headers = {} } = {}, data = {} } = error.response - errInfo.url = url - errInfo.name = 'Ajax Error!' - errInfo.file = '-' - errInfo.stack = JSON.stringify(data) - errInfo.detail = JSON.stringify({ params, method, headers }) - } - this.addErrorLogInfo(errInfo as ErrorLogInfo) - }, - }, -}) - -// Need to be used outside the setup -export function useErrorLogStoreWithOut() { - return useErrorLogStore(store) -} diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index 901a8d28..f6e10a83 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -5,7 +5,7 @@ import { store } from '@/store' import { transformObjToRoute, flatMultiLevelRoutes } from '@/router/helper/routeHelper' import { transformRouteToMenu } from '@/router/helper/menuHelper' -import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic' +import { PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic' import { filter } from '@/utils/helper/treeHelper' @@ -216,7 +216,6 @@ export const usePermissionStore = defineStore({ routes = [PAGE_NOT_FOUND_ROUTE, ...routeList] // 添加更多配置的路由菜单 - routes.push(ERROR_LOG_ROUTE) routes.push(Dashboard) routes.push(...PROJECT_BASE) patchHomeAffix(routes) diff --git a/src/utils/http/axios/index.ts b/src/utils/http/axios/index.ts index e9e29af6..f45e17b7 100644 --- a/src/utils/http/axios/index.ts +++ b/src/utils/http/axios/index.ts @@ -12,7 +12,6 @@ import { useMessage } from '@/hooks/web/useMessage' import { RequestEnum, ResultEnum, ContentTypeEnum } from '@/enums/httpEnum' import { isString } from '@/utils/is' import { setObjToUrlParams, deepMerge } from '@/utils' -import { useErrorLogStoreWithOut } from '@/store/modules/errorLog' import { joinTimestamp, formatRequestDate } from './helper' import { useUserStoreWithOut } from '@/store/modules/user' import { AxiosRetry } from '@/utils/http/axios/axiosRetry' @@ -156,8 +155,6 @@ const transform: AxiosTransform = { * 响应错误处理 */ responseInterceptorsCatch: (axiosInstance: AxiosInstance, error: any) => { - const errorLogStore = useErrorLogStoreWithOut() - errorLogStore.addAjaxErrorInfo(error) const { response, code, message, config } = error || {} const errorMessageMode = config?.requestOptions?.errorMessageMode || 'none' const msg: string = response?.data?.error?.message ?? '' diff --git a/src/views/dashboard/workbench/components/DynamicInfo.vue b/src/views/dashboard/workbench/components/DynamicInfo.vue deleted file mode 100644 index b05beda8..00000000 --- a/src/views/dashboard/workbench/components/DynamicInfo.vue +++ /dev/null @@ -1,31 +0,0 @@ - - diff --git a/src/views/dashboard/workbench/components/ProjectCard.vue b/src/views/dashboard/workbench/components/ProjectCard.vue deleted file mode 100644 index 7a626d54..00000000 --- a/src/views/dashboard/workbench/components/ProjectCard.vue +++ /dev/null @@ -1,24 +0,0 @@ - - diff --git a/src/views/dashboard/workbench/components/QuickNav.vue b/src/views/dashboard/workbench/components/QuickNav.vue deleted file mode 100644 index af561797..00000000 --- a/src/views/dashboard/workbench/components/QuickNav.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/dashboard/workbench/components/SaleRadar.vue b/src/views/dashboard/workbench/components/SaleRadar.vue deleted file mode 100644 index d4f73b72..00000000 --- a/src/views/dashboard/workbench/components/SaleRadar.vue +++ /dev/null @@ -1,94 +0,0 @@ - - diff --git a/src/views/dashboard/workbench/components/WorkbenchHeader.vue b/src/views/dashboard/workbench/components/WorkbenchHeader.vue deleted file mode 100644 index 830a1219..00000000 --- a/src/views/dashboard/workbench/components/WorkbenchHeader.vue +++ /dev/null @@ -1,33 +0,0 @@ - - diff --git a/src/views/dashboard/workbench/components/data.ts b/src/views/dashboard/workbench/components/data.ts deleted file mode 100644 index 432c37f2..00000000 --- a/src/views/dashboard/workbench/components/data.ts +++ /dev/null @@ -1,156 +0,0 @@ -interface GroupItem { - title: string - icon: string - color: string - desc: string - date: string - group: string -} - -interface NavItem { - title: string - icon: string - color: string -} - -interface DynamicInfoItem { - avatar: string - name: string - date: string - desc: string -} - -export const navItems: NavItem[] = [ - { - title: '首页', - icon: 'ion:home-outline', - color: '#1fdaca', - }, - { - title: '仪表盘', - icon: 'ion:grid-outline', - color: '#bf0c2c', - }, - { - title: '组件', - icon: 'ion:layers-outline', - color: '#e18525', - }, - { - title: '系统管理', - icon: 'ion:settings-outline', - color: '#3fb27f', - }, - { - title: '权限管理', - icon: 'ion:key-outline', - color: '#4daf1bc9', - }, - { - title: '图表', - icon: 'ion:bar-chart-outline', - color: '#00d8ff', - }, -] - -export const dynamicInfoItems: DynamicInfoItem[] = [ - { - avatar: 'dynamic-avatar-1|svg', - name: '威廉', - date: '刚刚', - desc: `在 开源组 创建了项目 Vue`, - }, - { - avatar: 'dynamic-avatar-2|svg', - name: '艾文', - date: '1个小时前', - desc: `关注了 威廉 `, - }, - { - avatar: 'dynamic-avatar-3|svg', - name: '克里斯', - date: '1天前', - desc: `发布了 个人动态 `, - }, - { - avatar: 'dynamic-avatar-4|svg', - name: 'Vben', - date: '2天前', - desc: `发表文章 如何编写一个Vite插件 `, - }, - { - avatar: 'dynamic-avatar-5|svg', - name: '皮特', - date: '3天前', - desc: `回复了 杰克 的问题 如何进行项目优化?`, - }, - { - avatar: 'dynamic-avatar-6|svg', - name: '杰克', - date: '1周前', - desc: `关闭了问题 如何运行项目 `, - }, - { - avatar: 'dynamic-avatar-1|svg', - name: '威廉', - date: '1周前', - desc: `发布了 个人动态 `, - }, - { - avatar: 'dynamic-avatar-1|svg', - name: '威廉', - date: '2021-04-01 20:00', - desc: `推送了代码到 Github`, - }, -] - -export const groupItems: GroupItem[] = [ - { - title: 'Github', - icon: 'carbon:logo-github', - color: '', - desc: '不要等待机会,而要创造机会。', - group: '开源组', - date: '2021-04-01', - }, - { - title: 'Vue', - icon: 'ion:logo-vue', - color: '#3fb27f', - desc: '现在的你决定将来的你。', - group: '算法组', - date: '2021-04-01', - }, - { - title: 'Html5', - icon: 'ion:logo-html5', - color: '#e18525', - desc: '没有什么才能比努力更重要。', - group: '上班摸鱼', - date: '2021-04-01', - }, - { - title: 'Angular', - icon: 'ion:logo-angular', - color: '#bf0c2c', - desc: '热情和欲望可以突破一切难关。', - group: 'UI', - date: '2021-04-01', - }, - { - title: 'React', - icon: 'bx:bxl-react', - color: '#00d8ff', - desc: '健康的身体是实现目标的基石。', - group: '技术牛', - date: '2021-04-01', - }, - { - title: 'Js', - icon: 'ion:logo-javascript', - color: '#EBD94E', - desc: '路是走出来的,而不是空想出来的。', - group: '架构组', - date: '2021-04-01', - }, -] diff --git a/src/views/dashboard/workbench/index.vue b/src/views/dashboard/workbench/index.vue deleted file mode 100644 index 3b8894d7..00000000 --- a/src/views/dashboard/workbench/index.vue +++ /dev/null @@ -1,36 +0,0 @@ - - diff --git a/src/views/sys/error-log/DetailModal.vue b/src/views/sys/error-log/DetailModal.vue deleted file mode 100644 index 4b14de5d..00000000 --- a/src/views/sys/error-log/DetailModal.vue +++ /dev/null @@ -1,27 +0,0 @@ - - diff --git a/src/views/sys/error-log/data.tsx b/src/views/sys/error-log/data.tsx deleted file mode 100644 index 57a1a121..00000000 --- a/src/views/sys/error-log/data.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { Tag } from 'ant-design-vue' -import { BasicColumn } from '@/components/Table' -import { ErrorTypeEnum } from '@/enums/exceptionEnum' -import { useI18n } from '@/hooks/web/useI18n' - -const { t } = useI18n() - -export function getColumns(): BasicColumn[] { - return [ - { - dataIndex: 'type', - title: t('sys.errorLog.tableColumnType'), - width: 80, - customRender: ({ text }) => { - const color = - text === ErrorTypeEnum.VUE - ? 'green' - : text === ErrorTypeEnum.RESOURCE - ? 'cyan' - : text === ErrorTypeEnum.PROMISE - ? 'blue' - : ErrorTypeEnum.AJAX - ? 'red' - : 'purple' - return {() => text} - }, - }, - { - dataIndex: 'url', - title: 'URL', - width: 200, - }, - { - dataIndex: 'time', - title: t('sys.errorLog.tableColumnDate'), - width: 160, - }, - { - dataIndex: 'file', - title: t('sys.errorLog.tableColumnFile'), - width: 200, - }, - { - dataIndex: 'name', - title: 'Name', - width: 200, - }, - { - dataIndex: 'message', - title: t('sys.errorLog.tableColumnMsg'), - width: 300, - }, - { - dataIndex: 'stack', - title: t('sys.errorLog.tableColumnStackMsg'), - }, - ] -} - -export function getDescSchema(): any { - return getColumns().map((column) => { - return { - field: column.dataIndex!, - label: column.title, - } - }) -} diff --git a/src/views/sys/error-log/index.vue b/src/views/sys/error-log/index.vue deleted file mode 100644 index 2ca9ea9c..00000000 --- a/src/views/sys/error-log/index.vue +++ /dev/null @@ -1,97 +0,0 @@ - - - diff --git a/types/config.d.ts b/types/config.d.ts index f413f228..916db454 100644 --- a/types/config.d.ts +++ b/types/config.d.ts @@ -126,8 +126,6 @@ export interface ProjectConfig { showBreadCrumb: boolean // Show breadcrumb icon showBreadCrumbIcon: boolean - // Use error-handler-plugin - useErrorHandle: boolean // Whether to open back to top useOpenBackTop: boolean // Is it possible to embed iframe pages