diff --git a/.eslintrc.js b/.eslintrc.js
index d27e761e..d01f44ae 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -20,6 +20,10 @@ module.exports = {
   extends: ['plugin:vue/vue3-essential', 'eslint:recommended'],
   rules: {
     'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
-    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+    'no-unused-vars': 'off',
+    'vue/multi-word-component-names': 'off',
+    'vue/valid-template-root': 'off',
+    'vue/no-mutating-props': 'off'
   }
 }
diff --git a/package.json b/package.json
index c839d980..a830dd7f 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,9 @@
     "build": "vue-tsc --noEmit && vite build",
     "preview": "vite preview",
     "new": "plop --plopfile ./plop/plopfile.js",
-    "postinstall": "husky install"
+    "postinstall": "husky install",
+    "lint": "eslint --ext .js,.jsx,.ts,.tsx,.vue src",
+    "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx,.vue src --fix"
   },
   "dependencies": {
     "@types/color": "^3.0.3",
diff --git a/src/api/http.ts b/src/api/http.ts
index f6657c65..4462c332 100644
--- a/src/api/http.ts
+++ b/src/api/http.ts
@@ -87,7 +87,7 @@ export const http = (type?: RequestHttpEnum) => {
  * @param globalParams 全局参数
  */
 export const customizeHttp = (targetParams: RequestConfigType, globalParams: RequestGlobalConfigType) => {
-  if(!targetParams || !globalParams) {
+  if (!targetParams || !globalParams) {
     return
   }
 
@@ -127,7 +127,7 @@ export const customizeHttp = (targetParams: RequestConfigType, globalParams: Req
   // 处理头部
   const headers: RequestParamsObjType = {
     ...globalRequestParams.Header,
-    ...targetRequestParams.Header,
+    ...targetRequestParams.Header
   }
 
   // data 参数
@@ -155,15 +155,16 @@ export const customizeHttp = (targetParams: RequestConfigType, globalParams: Req
       data = targetRequestParams.Body['xml']
       break
 
-    case RequestBodyEnum.X_WWW_FORM_URLENCODED:
+    case RequestBodyEnum.X_WWW_FORM_URLENCODED: {
       headers['Content-Type'] = ContentTypeEnum.FORM_URLENCODED
       const bodyFormData = targetRequestParams.Body['x-www-form-urlencoded']
       for (const i in bodyFormData) formData.set(i, bodyFormData[i])
       // FormData 赋值给 data
       data = formData
       break
+    }
 
-    case RequestBodyEnum.FORM_DATA:
+    case RequestBodyEnum.FORM_DATA: {
       headers['Content-Type'] = ContentTypeEnum.FORM_DATA
       const bodyFormUrlencoded = targetRequestParams.Body['form-data']
       for (const i in bodyFormUrlencoded) {
@@ -172,6 +173,7 @@ export const customizeHttp = (targetParams: RequestConfigType, globalParams: Req
       // FormData 赋值给 data
       data = formData
       break
+    }
   }
 
   // sql 处理
diff --git a/src/components/I18n/index.vue b/src/components/I18n/index.vue
index 65b11cb0..4f5cced7 100644
--- a/src/components/I18n/index.vue
+++ b/src/components/I18n/index.vue
@@ -1,3 +1,4 @@
+<!-- eslint-disable vue/valid-template-root -->
 <template></template>
 
 <script lang="ts" setup>
diff --git a/src/components/Plugins/DialogContent/index.vue b/src/components/Plugins/DialogContent/index.vue
index 474267e0..30163fba 100644
--- a/src/components/Plugins/DialogContent/index.vue
+++ b/src/components/Plugins/DialogContent/index.vue
@@ -1,6 +1,7 @@
+<!-- eslint-disable vue/valid-template-root -->
 <template></template>
 <script lang="ts" setup>
-import { useDialog } from 'naive-ui';
+import { useDialog } from 'naive-ui'
 //挂载在 window 方便与在js中使用
-window['$dialog'] = useDialog();
+window['$dialog'] = useDialog()
 </script>
diff --git a/src/components/Plugins/LoadingContent/index.vue b/src/components/Plugins/LoadingContent/index.vue
index 42d8d06c..31e33db6 100644
--- a/src/components/Plugins/LoadingContent/index.vue
+++ b/src/components/Plugins/LoadingContent/index.vue
@@ -1,3 +1,4 @@
+<!-- eslint-disable vue/valid-template-root -->
 <template></template>
 
 <script lang="ts" setup>
diff --git a/src/components/Plugins/MessageContent/index.vue b/src/components/Plugins/MessageContent/index.vue
index b6e1ca54..881071a1 100644
--- a/src/components/Plugins/MessageContent/index.vue
+++ b/src/components/Plugins/MessageContent/index.vue
@@ -1,7 +1,8 @@
+<!-- eslint-disable vue/valid-template-root -->
 <template></template>
 
 <script lang="ts" setup>
-import { useMessage } from 'naive-ui';
+import { useMessage } from 'naive-ui'
 //挂载在 window 方便与在js中使用
-window['$message'] = useMessage();
+window['$message'] = useMessage()
 </script>
diff --git a/src/hooks/useChartDataFetch.hook.ts b/src/hooks/useChartDataFetch.hook.ts
index 0462e181..8978df15 100644
--- a/src/hooks/useChartDataFetch.hook.ts
+++ b/src/hooks/useChartDataFetch.hook.ts
@@ -25,7 +25,7 @@ export const useChartDataFetch = (
 
   const requestIntervalFn = () => {
     const chartEditStore = useChartEditStore()
-    
+
     // 全局数据
     const {
       requestOriginUrl,
@@ -88,6 +88,7 @@ export const useChartDataFetch = (
         // 开启轮询
         if (time) fetchInterval = setInterval(fetchFn, intervalUnitHandle(time, unit))
       }
+      // eslint-disable-next-line no-empty
     } catch (error) {}
   }
 
diff --git a/src/router/types.ts b/src/router/types.ts
index 00febefb..59c3b14a 100644
--- a/src/router/types.ts
+++ b/src/router/types.ts
@@ -1,38 +1,40 @@
-import type { RouteRecordRaw, RouteMeta } from 'vue-router';
-import { defineComponent } from 'vue';
+import type { RouteRecordRaw, RouteMeta } from 'vue-router'
+import { defineComponent } from 'vue'
+
+declare type Recordable<T = any> = Record<string, T>
 
 export type Component<T extends any = any> =
   | ReturnType<typeof defineComponent>
   | (() => Promise<typeof import('*.vue')>)
-  | (() => Promise<T>);
-  
+  | (() => Promise<T>)
+
 // @ts-ignore
 export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
-  name: string;
-  meta: RouteMeta;
-  component?: Component | string;
-  components?: Component;
-  children?: AppRouteRecordRaw[];
-  props?: Recordable;
-  fullPath?: string;
+  name: string
+  meta: RouteMeta
+  component?: Component | string
+  components?: Component
+  children?: AppRouteRecordRaw[]
+  props?: Recordable
+  fullPath?: string
 }
 
 export interface Meta {
   // 名称
-  title: string;
+  title: string
   // 是否忽略权限
-  ignoreAuth?: boolean;
-  permissions?: string[];
+  ignoreAuth?: boolean
+  permissions?: string[]
   // 是否不缓存
-  noKeepAlive?: boolean;
+  noKeepAlive?: boolean
   // 是否固定在tab上
-  affix?: boolean;
+  affix?: boolean
   // tab上的图标
-  icon?: string;
+  icon?: string
   // 跳转地址
-  frameSrc?: string;
+  frameSrc?: string
   // 外链跳转地址
-  externalLink?: string;
+  externalLink?: string
   //隐藏
-  hidden?: boolean;
-}
\ No newline at end of file
+  hidden?: boolean
+}
diff --git a/src/store/modules/chartEditStore/chartEditStore.d.ts b/src/store/modules/chartEditStore/chartEditStore.d.ts
index 1defbb77..32c71479 100644
--- a/src/store/modules/chartEditStore/chartEditStore.d.ts
+++ b/src/store/modules/chartEditStore/chartEditStore.d.ts
@@ -93,6 +93,7 @@ export interface EditCanvasConfigType {
 }
 
 // 坐标轴信息
+// eslint-disable-next-line no-redeclare
 export enum EditCanvasTypeEnum {
   START_X = 'startX',
   START_Y = 'startY',
diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts
index bd2f70ba..a2be5775 100644
--- a/src/store/modules/chartEditStore/chartEditStore.ts
+++ b/src/store/modules/chartEditStore/chartEditStore.ts
@@ -600,7 +600,7 @@ export const useChartEditStore = defineStore({
               ids.push(item.id)
             })
           } else {
-            ;(historyData[0] as CreateComponentGroupType).groupList.forEach(item => {
+            (historyData[0] as CreateComponentGroupType).groupList.forEach(item => {
               ids.push(item.id)
             })
           }
diff --git a/src/utils/storage.ts b/src/utils/storage.ts
index 60e7c7e8..d55d33bd 100644
--- a/src/utils/storage.ts
+++ b/src/utils/storage.ts
@@ -1,11 +1,10 @@
-
 /**
  * * 存储本地会话数据
  * @param k 键名
  * @param v 键值(无需stringiiy)
  * @returns RemovableRef
  */
- export const setLocalStorage = <T>(k: string, v: T) => {
+export const setLocalStorage = <T>(k: string, v: T) => {
   try {
     window.localStorage.setItem(k, JSON.stringify(v))
   } catch (error) {
@@ -18,7 +17,7 @@
  * @param k 键名
  * @returns any
  */
- export const getLocalStorage = (k: string) => {
+export const getLocalStorage = (k: string) => {
   const item = window.localStorage.getItem(k)
   try {
     return item ? JSON.parse(item) : item
@@ -29,9 +28,9 @@
 
 /**
  * * 清除本地会话数据
- * @param name 
+ * @param name
  */
- export const clearLocalStorage = (name: string) => {
+export const clearLocalStorage = (name: string) => {
   window.localStorage.removeItem(name)
 }
 
@@ -64,8 +63,8 @@ export const getSessionStorage: (k: string) => any = (k: string) => {
 
 /**
  * * 清除本地会话数据
- * @param name 
+ * @param name
  */
 export const clearSessioStorage = (name: string) => {
   window.sessionStorage.removeItem(name)
-}
\ No newline at end of file
+}
diff --git a/src/utils/utils.ts b/src/utils/utils.ts
index 9d7ae3ae..8b686eb0 100644
--- a/src/utils/utils.ts
+++ b/src/utils/utils.ts
@@ -135,11 +135,13 @@ export const fileTobase64 = (file: File, callback: Function) => {
 /**
  * * 挂载监听
  */
+// eslint-disable-next-line no-undef
 export const addEventListener = <K extends keyof WindowEventMap>(
   target: HTMLElement | Document,
   type: K,
   listener: any,
   delay?: number,
+  // eslint-disable-next-line no-undef
   options?: boolean | AddEventListenerOptions | undefined
 ) => {
   if (!target) return
@@ -156,6 +158,7 @@ export const addEventListener = <K extends keyof WindowEventMap>(
 /**
  * * 卸载监听
  */
+// eslint-disable-next-line no-undef
 export const removeEventListener = <K extends keyof WindowEventMap>(
   target: HTMLElement | Document,
   type: K,
@@ -245,12 +248,12 @@ export const intervalUnitHandle = (num: number, unit: RequestHttpIntervalEnum) =
 
 /**
  * * 对象转换 cookie 格式
- * @param obj 
+ * @param obj
  * @returns string
  */
 export const objToCookie = (obj: RequestParamsObjType) => {
-  if(!obj) return ''
-  
+  if (!obj) return ''
+
   let str = ''
   for (const key in obj) {
     str += key + '=' + obj[key] + ';'
diff --git a/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue b/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue
index 5be48f5e..f9ae88cd 100644
--- a/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue
+++ b/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue
@@ -9,7 +9,7 @@
       :icon-size="16"
       :indent="18"
       @update:value="clickItemHandle"
-   ></n-menu>
+    ></n-menu>
     <div class="chart-content-list">
       <n-scrollbar>
         <charts-item-box :menuOptions="packages.selectOptions"></charts-item-box>
@@ -24,14 +24,12 @@ import { ConfigType } from '@/packages/index.d'
 import { useSettingStore } from '@/store/modules/settingStore/settingStore'
 import { loadAsyncComponent } from '@/utils'
 
-const ChartsItemBox = loadAsyncComponent(() =>
-  import('../ChartsItemBox/index.vue')
-)
+const ChartsItemBox = loadAsyncComponent(() => import('../ChartsItemBox/index.vue'))
 
 const props = defineProps({
   selectOptions: {
     type: Object,
-    default: () => []
+    default: () => {}
   }
 })
 
diff --git a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.vue b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.vue
index 56737842..f890f2f7 100644
--- a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.vue
+++ b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.vue
@@ -138,9 +138,11 @@ const filterRes = computed(() => {
   try {
     const fn = new Function('data', filter.value)
     const res = fn(cloneDeep(sourceData.value))
+    // eslint-disable-next-line vue/no-side-effects-in-computed-properties
     errorFlag.value = false
     return toString(res)
   } catch (error) {
+    // eslint-disable-next-line vue/no-side-effects-in-computed-properties
     errorFlag.value = true
     return '过滤函数错误'
   }
diff --git a/src/views/chart/ContentConfigurations/index.vue b/src/views/chart/ContentConfigurations/index.vue
index 6d408f48..c1b11b20 100644
--- a/src/views/chart/ContentConfigurations/index.vue
+++ b/src/views/chart/ContentConfigurations/index.vue
@@ -102,6 +102,7 @@ const selectTarget = computed(() => {
   if (selectId.length !== 1) return undefined
   const target = chartEditStore.componentList[chartEditStore.fetchTargetIndex()]
   if (target?.isGroup) {
+    // eslint-disable-next-line vue/no-side-effects-in-computed-properties
     tabsSelect.value = TabsEnum.CHART_SETTING
   }
   return target
diff --git a/src/views/chart/ContentHeader/headerTitle/index.vue b/src/views/chart/ContentHeader/headerTitle/index.vue
index adf6fbde..5ac70dc8 100644
--- a/src/views/chart/ContentHeader/headerTitle/index.vue
+++ b/src/views/chart/ContentHeader/headerTitle/index.vue
@@ -24,7 +24,7 @@
       v-model:value.trim="title"
       @keyup.enter="handleBlur"
       @blur="handleBlur"
-   ></n-input>
+    ></n-input>
   </n-space>
 </template>
 
@@ -50,16 +50,16 @@ const fetchProhectInfoById = () => {
 
 const title = ref<string>(fetchProhectInfoById() || '')
 
-
 const comTitle = computed(() => {
-  title.value = title.value.replace(/\s/g, "");
+  // eslint-disable-next-line vue/no-side-effects-in-computed-properties
+  title.value = title.value.replace(/\s/g, '')
   return title.value.length ? title.value : '新项目'
 })
 
 const handleFocus = () => {
   focus.value = true
   nextTick(() => {
-    ; (<any>inputInstRef).value.focus()
+    inputInstRef.value && (inputInstRef.value as any).focus()
   })
 }
 
@@ -71,4 +71,4 @@ const handleBlur = () => {
 .title {
   font-size: 15px;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/chart/ContentLayers/components/LayersListItem/index.vue b/src/views/chart/ContentLayers/components/LayersListItem/index.vue
index 437a7a73..5ef4cdb2 100644
--- a/src/views/chart/ContentLayers/components/LayersListItem/index.vue
+++ b/src/views/chart/ContentLayers/components/LayersListItem/index.vue
@@ -1,8 +1,5 @@
 <template>
-  <div
-    class="go-content-layers-list-item"
-    :class="{ hover: hover, select: select }"
-  >
+  <div class="go-content-layers-list-item" :class="{ hover: hover, select: select }">
     <div class="go-flex-center item-content">
       <n-image
         class="list-img"
@@ -10,7 +7,7 @@
         preview-disabled
         :src="image"
         :fallback-src="requireErrorImg()"
-     ></n-image>
+      ></n-image>
       <n-ellipsis>
         <n-text class="list-text" :depth="2">
           {{ props.componentData.chartConfig.title }}
@@ -43,6 +40,7 @@ const props = defineProps({
   }
 })
 
+// eslint-disable-next-line vue/no-setup-props-destructure
 const { image } = props.componentData.chartConfig
 
 // 计算当前选中目标
@@ -80,7 +78,7 @@ $textSize: 10px;
     /* 需要设置最高级,覆盖 hover 的颜色 */
     background-color: rgba(0, 0, 0, 0);
     .list-img {
-      border:1px solid v-bind('themeColor')!important;
+      border: 1px solid v-bind('themeColor') !important;
     }
   }
   .select-modal,
diff --git a/src/views/chart/hooks/useSync.hook.ts b/src/views/chart/hooks/useSync.hook.ts
index 09a26aa9..a448f0e7 100644
--- a/src/views/chart/hooks/useSync.hook.ts
+++ b/src/views/chart/hooks/useSync.hook.ts
@@ -35,7 +35,7 @@ export const useSync = () => {
       }
 
       if (e.isGroup) {
-        ;(e as CreateComponentGroupType).groupList.forEach(groupItem => {
+        (e as CreateComponentGroupType).groupList.forEach(groupItem => {
           intComponent(groupItem)
         })
       } else {
diff --git a/tsconfig.json b/tsconfig.json
index fdf7649f..07a4c65b 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -10,37 +10,16 @@
     "resolveJsonModule": true,
     "esModuleInterop": true,
     "skipLibCheck": true,
-    "lib": [
-      "es6",
-      "ESNext",
-      "dom"
-    ],
-    "types": [
-      "vite/client"
-    ],
+    "lib": ["es6", "ESNext", "dom"],
+    "types": ["vite/client"],
     "paths": {
-      "@/*": [
-        "src/*"
-      ],
-      "/#/*": [
-        "types/*"
-      ]
+      "@/*": ["src/*"],
+      "/#/*": ["types/*"]
     },
     "noImplicitAny": true, //不允许使用any
     // "strictNullChecks": true, //不允许使用null
     "noImplicitThis": true //不允许往this上面挂属性
   },
-  "include": [
-    "src/**/*.ts",
-    "src/**/*.d.ts",
-    "src/**/*.tsx",
-    "src/**/*.vue",
-    "types/**/*.d.ts",
-    "types/**/*.ts",
-  ],
-  "exclude": [
-    "node_modules",
-    "dist",
-    "**/*.js"
-  ]
-}
\ No newline at end of file
+  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "types/**/*"],
+  "exclude": ["node_modules", "dist", "**/*.js"]
+}