diff --git a/package.json b/package.json
index 36e22bb70..b34de4d6c 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,7 @@
     "type-check": "vue-tsc --build --force",
     "report": "vite build",
     "preview": "vite preview",
-    "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
+    "lint": "eslint  --fix  . --ext .vue,.js,.ts,.tsx,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
     "format": "prettier --write src/",
     "prepare": "husky",
     "commit": "git-cz"
diff --git a/src/api/user.ts b/src/api/user.ts
index 744e2aa53..2246883d8 100644
--- a/src/api/user.ts
+++ b/src/api/user.ts
@@ -1,29 +1,29 @@
-import request from '../utils/request'
+import { request } from '@/utils/request'
 
-export function userinfo(params, data) {
+export function userinfo(params?: any, data?: any) {
   return request({ url: '/user/userinfo', method: 'get', params, data })
 }
 
-export function userVideoList(params, data) {
+export function userVideoList(params?: any, data?: any) {
   return request({ url: '/user/video_list', method: 'get', params, data })
 }
 
-export function panel(params, data) {
+export function panel(params?: any, data?: any) {
   return request({ url: '/user/panel', method: 'get', params, data })
 }
 
-export function friends(params, data) {
+export function friends(params?: any, data?: any) {
   return request({ url: '/user/friends', method: 'get', params, data })
 }
 
-export function userCollect(params, data) {
+export function userCollect(params?: any, data?: any) {
   return request({ url: '/user/collect', method: 'get', params, data })
 }
 
-export function recommendedPost(params, data) {
+export function recommendedPost(params?: any, data?: any) {
   return request({ url: '/post/recommended', method: 'get', params, data })
 }
 
-export function recommendedShop(params, data) {
+export function recommendedShop(params?: any, data?: any) {
   return request({ url: '/shop/recommended', method: 'get', params, data })
 }
diff --git a/src/api/videos.ts b/src/api/videos.ts
index bc5f99fad..bbbd06bed 100644
--- a/src/api/videos.ts
+++ b/src/api/videos.ts
@@ -1,28 +1,29 @@
-import request from '../utils/request'
+import { request } from '@/utils/request'
 
-export function historyOther(params, data) {
+export function historyOther(params?: any, data?: any) {
   return request({ url: '/video/historyOther', method: 'get', params, data })
 }
 
-export function historyVideo(params, data) {
+export function historyVideo(params?: any, data?: any) {
   return request({ url: '/video/history', method: 'get', params, data })
 }
 
-export function recommendedVideo(params, data) {
+export function recommendedVideo(params?: any, data?: any) {
   return request({ url: '/video/recommended', method: 'get', params, data })
 }
 
-export function myVideo(params, data) {
+export function myVideo(params?: any, data?: any) {
   return request({ url: '/video/my', method: 'get', params, data })
 }
 
-export function privateVideo(params, data) {
+export function privateVideo(params?: any, data?: any) {
   return request({ url: '/video/private', method: 'get', params, data })
 }
 
-export function likeVideo(params, data) {
+export function likeVideo(params?: any, data?: any) {
   return request({ url: '/video/like', method: 'get', params, data })
 }
-export function videoComments(params, data) {
+
+export function videoComments(params?: any, data?: any) {
   return request({ url: '/video/comments', method: 'get', params, data })
 }
diff --git a/src/components/slide/SlideAlbum.vue b/src/components/slide/SlideAlbum.vue
index 128f5be69..ee4a6bf6a 100644
--- a/src/components/slide/SlideAlbum.vue
+++ b/src/components/slide/SlideAlbum.vue
@@ -236,7 +236,6 @@ const props = defineProps({
     }
   }
 })
-const judgeValue = 20
 const wrapperEl = ref(null)
 
 //用于解决,touch事件触发startPlay,然后click事件又触发stopLoop的问题
diff --git a/src/components/slide/SlideHorizontal.vue b/src/components/slide/SlideHorizontal.vue
index d853f4951..c6de2e916 100644
--- a/src/components/slide/SlideHorizontal.vue
+++ b/src/components/slide/SlideHorizontal.vue
@@ -22,6 +22,14 @@ const props = defineProps({
     type: String,
     default: () => ''
   },
+  autoplay: {
+    type: Boolean,
+    default: () => false
+  },
+  indicator: {
+    type: Boolean,
+    default: () => false
+  },
   //改变index,是否使用动画
   changeActiveIndexUseAnim: {
     type: Boolean,
@@ -69,6 +77,16 @@ watch(
 onMounted(() => {
   slideInit(wrapperEl.value, state)
 
+  if (props.autoplay) {
+    setInterval(() => {
+      if (state.localIndex === state.wrapper.childrenLength - 1) {
+        emit('update:index', 0)
+      } else {
+        emit('update:index', state.localIndex + 1)
+      }
+    }, 3000)
+  }
+
   //观察子元素数量变动,获取最新数量
   //childrenLength用于canNext方法判断当前页是否是最后一页,是则不能滑动,不捕获事件
   ob = new MutationObserver(() => {
@@ -97,6 +115,15 @@ function touchEnd(e: TouchEvent) {
 
 <template>
   <div class="slide horizontal">
+    <div class="indicator-bullets" v-if="indicator && state.wrapper.childrenLength">
+      <div
+        class="bullet"
+        :class="{ active: state.localIndex === item - 1 }"
+        :key="i"
+        v-for="(item, i) in state.wrapper.childrenLength"
+      ></div>
+    </div>
+
     <div
       class="slide-list"
       ref="wrapperEl"
@@ -108,3 +135,28 @@ function touchEnd(e: TouchEvent) {
     </div>
   </div>
 </template>
+
+<style scoped lang="less">
+.indicator-bullets {
+  position: absolute;
+  bottom: 10rem;
+  z-index: 2;
+  left: 0;
+  display: flex;
+  justify-content: center;
+  width: 100%;
+
+  .bullet {
+    @width: 5rem;
+    width: @width;
+    height: @width;
+    margin: 0 3rem;
+    border-radius: 50%;
+    background: var(--second-btn-color);
+
+    &.active {
+      background: white;
+    }
+  }
+}
+</style>
diff --git a/src/config/index.ts b/src/config/index.ts
index 2646d643c..e0b44661e 100644
--- a/src/config/index.ts
+++ b/src/config/index.ts
@@ -16,3 +16,4 @@ export const IS_SUB_DOMAIN = ['GITEE_PAGES', 'GP_PAGES'].includes(import.meta.en
 export const BASE_URL = BASE_URL_MAP[import.meta.env.VITE_ENV]
 export const IMG_URL = BASE_URL + '/images/'
 export const FILE_URL = BASE_URL + '/data/'
+export const IS_DEV = process.env.NODE_ENV !== 'production'
diff --git a/src/mock/index.ts b/src/mock/index.ts
index d1bdf1b6e..92ed7980c 100644
--- a/src/mock/index.ts
+++ b/src/mock/index.ts
@@ -3,7 +3,7 @@ import posts6 from '@/assets/data/posts6.json'
 import { _fetch, cloneDeep, random } from '@/utils'
 import { BASE_URL, FILE_URL } from '@/config'
 import { useBaseStore } from '@/store/pinia'
-import axiosInstance from '@/utils/request'
+import { axiosInstance } from '@/utils/request'
 import MockAdapter from 'axios-mock-adapter'
 
 const mock = new MockAdapter(axiosInstance, { delayResponse: 300 })
diff --git a/src/pages/home/SearchPage.vue b/src/pages/home/SearchPage.vue
index 6fde652e7..16c5ab7d8 100644
--- a/src/pages/home/SearchPage.vue
+++ b/src/pages/home/SearchPage.vue
@@ -57,7 +57,7 @@
             品牌榜
           </div>
         </div>
-        <!--        TODO 滚动到下面的时候,应该禁止slide-move,因为第个slideitem的高度不一样,高的切到矮的,会闪屏-->
+        <!--        TODO 滚动到下面的时候,应该禁止slide-move,因为每个slideitem的高度不一样,高的切到矮的,会闪屏-->
         <SlideHorizontal v-model:index="data.slideIndex" :style="slideListHeight">
           <SlideItem>
             <div class="slide0" ref="slide0">
@@ -179,7 +179,7 @@
                 <div class="brands">
                   <div
                     class="brand"
-                    @click="toggleKey(key)"
+                    @click="toggleKey(key, i)"
                     :key="i"
                     :class="{ active: key === data.selectBrandKey }"
                     v-for="(key, i) in Object.keys(data.brandRankList)"
@@ -198,7 +198,6 @@
                       <div class="avatar-wrapper" :class="item.living ? 'living' : ''">
                         <div class="avatar-out-line"></div>
                         <img v-lazy="_checkImgUrl(item.logo)" alt="" class="avatar" />
-                        <!--                      <img :src="item.logo" class="avatar">-->
                       </div>
                       <div class="desc">{{ item.name }}</div>
                     </div>
@@ -211,7 +210,7 @@
                 <div class="more" @click="_no">查看完整品牌榜 ></div>
               </div>
 
-              <SlideRowList :autoplay="true" indicatorType="bullets">
+              <SlideHorizontal v-model:index="data.adIndex" :autoplay="true" indicator>
                 <SlideItem>
                   <div class="ad">AD1</div>
                 </SlideItem>
@@ -236,7 +235,7 @@
                 <SlideItem>
                   <div class="ad">AD8</div>
                 </SlideItem>
-              </SlideRowList>
+              </SlideHorizontal>
             </div>
           </SlideItem>
         </SlideHorizontal>
@@ -247,11 +246,8 @@
 <script setup lang="ts">
 import Search from '../../components/Search.vue'
 import Dom from '../../utils/dom'
-import { computed, nextTick, watch } from 'vue'
+import { computed, nextTick, onMounted, reactive, watch } from 'vue'
 import { _checkImgUrl, _formatNumber, _no, _showSimpleConfirmDialog, sampleSize } from '@/utils'
-
-import { useBaseStore } from '@/store/pinia'
-import { onMounted, reactive } from 'vue'
 import { useRouter } from 'vue-router'
 import { useNav } from '@/utils/hooks/useNav'
 
@@ -261,9 +257,9 @@ defineOptions({
 
 const router = useRouter()
 const nav = useNav()
-const store = useBaseStore()
 const data = reactive({
   isExpand: false,
+  adIndex: 0,
   history: [
     '历史记录1',
     '历史记录2',
@@ -696,7 +692,7 @@ watch(
         } else {
           data.selectBrandKeyIndex++
         }
-        data.selectBrandKey = brandListKeys[data.selectBrandKeyIndex]
+        data.selectBrandKey = brandListKeys.value[data.selectBrandKeyIndex]
       }, 3000)
     } else {
       clearInterval(data.timer)
@@ -710,8 +706,9 @@ onMounted(() => {
   refresh()
 })
 
-function toggleKey(key) {
+function toggleKey(key: string, i: number) {
   data.selectBrandKey = key
+  data.selectBrandKeyIndex = i
   clearInterval(data.timer)
 }
 
diff --git a/src/pages/home/slide/SlideList.vue b/src/pages/home/slide/SlideList.vue
index d25c1c5ec..f200c224a 100644
--- a/src/pages/home/slide/SlideList.vue
+++ b/src/pages/home/slide/SlideList.vue
@@ -89,7 +89,7 @@ async function getData(refresh = false) {
   })
   // console.log('getSlide4Data-', 'refresh', refresh, res)
   baseStore.loading = false
-  if (res.code === 200) {
+  if (res.success) {
     state.totalSize = res.data.total
     if (refresh) {
       state.list = []
diff --git a/src/pages/me/Me.vue b/src/pages/me/Me.vue
index e4becbd10..40acebc69 100644
--- a/src/pages/me/Me.vue
+++ b/src/pages/me/Me.vue
@@ -382,10 +382,11 @@ import { $no, _checkImgUrl, _formatNumber, _getUserDouyinId } from '@/utils'
 import { likeVideo, myVideo, privateVideo } from '@/api/videos'
 import { useBaseStore } from '@/store/pinia'
 import { userCollect } from '@/api/user'
+import SlideRowList from '@/components/slide/SlideRowList.vue'
 
 export default {
   name: 'Me',
-  components: { Posters, Indicator, ConfirmDialog },
+  components: { SlideRowList, Posters, Indicator, ConfirmDialog },
   data() {
     return {
       previewImg: '',
@@ -473,7 +474,7 @@ export default {
     }
   },
   mounted() {
-    setTimeout(() => {
+    nextTick(() => {
       this.refs.header = this.$refs.header
       this.refs.headerHeight = this.$refs.header.offsetHeight
       this.refs.descHeight = this.$refs.desc.offsetHeight
@@ -537,7 +538,7 @@ export default {
           this.loadings['loading' + newVal] = true
           let res = await userCollect()
           console.log('res', res)
-          if (res.code === this.SUCCESS) this.videos.collect = res.data
+          if (res.success) this.videos.collect = res.data
         }
       } else {
         if (videoOb.total === -1) {
@@ -549,21 +550,21 @@ export default {
                 pageNo: this.videos.my.pageNo,
                 pageSize: this.pageSize
               })
-              if (res.code === this.SUCCESS) this.videos.my = res.data
+              if (res.success) this.videos.my = res.data
               break
             case 1:
               res = await privateVideo({
                 pageNo: this.videos.private.pageNo,
                 pageSize: this.pageSize
               })
-              if (res.code === this.SUCCESS) this.videos.private = res.data
+              if (res.success) this.videos.private = res.data
               break
             case 2:
               res = await likeVideo({
                 pageNo: this.videos.like.pageNo,
                 pageSize: this.pageSize
               })
-              if (res.code === this.SUCCESS) this.videos.like = res.data
+              if (res.success) this.videos.like = res.data
               break
           }
         }
@@ -627,7 +628,7 @@ export default {
             break
         }
         this.loadings['loading' + this.contentIndex] = false
-        if (res.code === this.SUCCESS) {
+        if (res.success) {
           videoOb.list = videoOb.list.concat(res.data.list)
         }
       }
diff --git a/src/pages/me/MyMusic.vue b/src/pages/me/MyMusic.vue
index d3cd83799..52657e639 100644
--- a/src/pages/me/MyMusic.vue
+++ b/src/pages/me/MyMusic.vue
@@ -168,10 +168,8 @@ import IndicatorLight from '../../components/slide/IndicatorLight.vue'
 import GuessMusic from './components/GuessMusic.vue'
 import Loading from '../../components/Loading.vue'
 import { userCollect } from '@/api/user'
-import { useBaseStore } from '@/store/pinia'
 import { computed, onMounted, reactive, ref } from 'vue'
 import { useRouter } from 'vue-router'
-import { useNav } from '@/utils/hooks/useNav'
 import { _checkImgUrl, _duration, _no } from '@/utils'
 
 defineOptions({
diff --git a/src/pages/me/components/SlideItemMusic.vue b/src/pages/me/components/SlideItemMusic.vue
index f720f4690..f37d280db 100644
--- a/src/pages/me/components/SlideItemMusic.vue
+++ b/src/pages/me/components/SlideItemMusic.vue
@@ -214,7 +214,7 @@ export default {
       this.loading = true
       let res = await userCollect()
       this.loading = false
-      if (res.code === this.SUCCESS) {
+      if (res.success) {
         this.collectMusic = res.data.music.list.slice(0, 2)
         this.guessMusic = this.recommendMusic = res.data.music.list.slice(2, -1)
       }
diff --git a/src/pages/me/rightMenu/LookHistory.vue b/src/pages/me/rightMenu/LookHistory.vue
index abfb2ad81..6815d232c 100644
--- a/src/pages/me/rightMenu/LookHistory.vue
+++ b/src/pages/me/rightMenu/LookHistory.vue
@@ -16,7 +16,7 @@
         v-model:active-index="data.currentSlideItemIndex"
       >
       </Indicator>
-      <SlideHorizontal v-model:index="data.currentSlideItemIndex" class="SlideRowList">
+      <SlideHorizontal v-model:index="data.currentSlideItemIndex" class="SlideHorizontal">
         <SlideItem class="tab1" style="overflow: auto">
           <Scroll class="Scroll" @pulldown="getHistoryVideo">
             <Posters :list="data.historyVideo.list" v-if="data.historyVideo.total"></Posters>
@@ -150,7 +150,7 @@ function clear() {
   .content {
     padding-top: 60rem;
 
-    .SlideRowList,
+    .SlideHorizontal,
     .Scroll {
       height: calc(
         var(--vh, 1vh) * 100 - var(--indicator-height) - var(--common-header-height)
diff --git a/src/pages/message/RedPacketDetail.vue b/src/pages/message/RedPacketDetail.vue
index b2156f010..fb7e66712 100644
--- a/src/pages/message/RedPacketDetail.vue
+++ b/src/pages/message/RedPacketDetail.vue
@@ -21,8 +21,6 @@
 <script setup lang="ts">
 import { useBaseStore } from '@/store/pinia'
 import { _checkImgUrl, _no } from '@/utils'
-import { useRouter } from 'vue-router'
-import { useNav } from '@/utils/hooks/useNav'
 
 defineOptions({
   name: 'RedPacketDetail'
@@ -36,8 +34,6 @@ defineProps({
     }
   }
 })
-const router = useRouter()
-const nav = useNav()
 const store = useBaseStore()
 </script>
 
diff --git a/src/pages/message/Share2Friend.vue b/src/pages/message/Share2Friend.vue
index 854936032..89656f8bc 100644
--- a/src/pages/message/Share2Friend.vue
+++ b/src/pages/message/Share2Friend.vue
@@ -181,10 +181,7 @@
 <script setup lang="ts">
 import Check from '../../components/Check.vue'
 import { friends } from '@/api/user'
-
-import { useBaseStore } from '@/store/pinia'
 import { onMounted, reactive, ref, watch } from 'vue'
-import { useRouter } from 'vue-router'
 import { useNav } from '@/utils/hooks/useNav'
 import { _checkImgUrl, cloneDeep } from '@/utils'
 
@@ -192,9 +189,7 @@ defineOptions({
   name: 'Share2Friend'
 })
 
-const router = useRouter()
 const nav = useNav()
-const store = useBaseStore()
 const data = reactive({
   isCreateChat: false,
   searchKey: '',
diff --git a/src/pages/message/chat/Chat.vue b/src/pages/message/chat/Chat.vue
index 6906ed75f..554a15907 100644
--- a/src/pages/message/chat/Chat.vue
+++ b/src/pages/message/chat/Chat.vue
@@ -499,9 +499,6 @@ onUnmounted(() => {
 const isExpand = computed(() => {
   return data.showOption
 })
-const isTyping = computed(() => {
-  return data.typing || isExpand
-})
 
 function handleClick() {
   data.recording = true
diff --git a/src/pages/message/chat/ChatDetail.vue b/src/pages/message/chat/ChatDetail.vue
index 27689bb46..3274052fa 100644
--- a/src/pages/message/chat/ChatDetail.vue
+++ b/src/pages/message/chat/ChatDetail.vue
@@ -61,10 +61,7 @@ import Switches from '../components/swtich/switches.vue'
 import People from '../../people/components/People.vue'
 import BlockDialog from '../components/BlockDialog.vue'
 import CONST_VAR from '../../../utils/const_var'
-
-import { useBaseStore } from '@/store/pinia'
 import { onMounted, reactive } from 'vue'
-import { useRouter } from 'vue-router'
 import { useNav } from '@/utils/hooks/useNav'
 import { _showConfirmDialog } from '@/utils'
 
@@ -72,9 +69,7 @@ defineOptions({
   name: 'ChatDetail'
 })
 
-const router = useRouter()
 const nav = useNav()
-const store = useBaseStore()
 const data = reactive({
   noMessage: false,
   top: false,
diff --git a/src/pages/message/notice/NoticeSetting.vue b/src/pages/message/notice/NoticeSetting.vue
index 194880a01..90c3fd891 100644
--- a/src/pages/message/notice/NoticeSetting.vue
+++ b/src/pages/message/notice/NoticeSetting.vue
@@ -74,11 +74,8 @@
 </template>
 <script setup lang="ts">
 import Switches from '../components/swtich/switches.vue'
-
-import { useBaseStore } from '@/store/pinia'
 import { onMounted, reactive } from 'vue'
-import { useRoute, useRouter } from 'vue-router'
-import { useNav } from '@/utils/hooks/useNav'
+import { useRoute } from 'vue-router'
 
 defineOptions({
   name: 'NoticeSetting'
@@ -92,10 +89,7 @@ defineProps({
     }
   }
 })
-const router = useRouter()
 const route = useRoute()
-const nav = useNav()
-const store = useBaseStore()
 const data = reactive({
   option: true,
   option1: false,
diff --git a/src/pages/people/FollowAndFans.vue b/src/pages/people/FollowAndFans.vue
index c3c6a705b..321849b94 100644
--- a/src/pages/people/FollowAndFans.vue
+++ b/src/pages/people/FollowAndFans.vue
@@ -62,14 +62,13 @@ import Search from '../../components/Search.vue'
 import Indicator from '../../components/slide/Indicator.vue'
 import { useBaseStore } from '@/store/pinia'
 import { onMounted, reactive, watch } from 'vue'
-import { useRoute, useRouter } from 'vue-router'
+import { useRoute } from 'vue-router'
 import { useNav } from '@/utils/hooks/useNav'
 
 defineOptions({
   name: 'FindAcquaintance'
 })
 
-const router = useRouter()
 const route = useRoute()
 const nav = useNav()
 const store = useBaseStore()
diff --git a/src/store/pinia.ts b/src/store/pinia.ts
index 73774c86f..d786a98ab 100644
--- a/src/store/pinia.ts
+++ b/src/store/pinia.ts
@@ -1,5 +1,5 @@
 import { defineStore } from 'pinia'
-import { friends, panel } from '@/api/user.ts'
+import { friends, panel } from '@/api/user'
 import enums from '@/utils/enums'
 import resource from '@/assets/data/resource'
 
@@ -58,7 +58,7 @@ export const useBaseStore = defineStore('base', {
     async init() {
       const r = await panel()
       if (r.success) {
-        this.userinfo = r.data
+        this.userinfo = Object.assign(this.userinfo, r.data)
       }
       const r2 = await friends()
       if (r2.success) {
diff --git a/src/utils/dom.js b/src/utils/dom.ts
similarity index 91%
rename from src/utils/dom.js
rename to src/utils/dom.ts
index 37e231af2..49ef77186 100644
--- a/src/utils/dom.js
+++ b/src/utils/dom.ts
@@ -1,7 +1,7 @@
 export default class Dom {
   els = []
 
-  constructor(arg) {
+  constructor(arg?: any) {
     if (typeof arg === 'string') {
       return this.find(arg)
     }
@@ -35,7 +35,7 @@ export default class Dom {
   }
 
   find(tag) {
-    let els = []
+    let els: any = []
     if (this.els.length) {
       els = this.els[0].querySelectorAll(tag)
     } else {
@@ -48,7 +48,7 @@ export default class Dom {
   }
 
   create(template) {
-    let tempNode = document.createElement('div')
+    const tempNode = document.createElement('div')
     tempNode.innerHTML = template.trim()
     this.els = [tempNode.firstChild]
     return this
@@ -101,7 +101,7 @@ export default class Dom {
   }
 
   on(eventName, fn) {
-    let eventArray = eventName.split(' ')
+    const eventArray = eventName.split(' ')
     this.els.forEach((el) => {
       eventArray.map((event) => {
         el.addEventListener(event, fn)
@@ -111,7 +111,7 @@ export default class Dom {
   }
 
   trigger(eventName) {
-    let eventArray = eventName.split(' ')
+    const eventArray = eventName.split(' ')
     this.els.forEach((el) => {
       eventArray.map((event) => {
         el.dispatchEvent(new Event(event))
@@ -129,7 +129,7 @@ export default class Dom {
   }
 
   getStyleValue(key, value) {
-    let whiteList = ['top', 'left', 'right', 'bottom']
+    const whiteList = ['top', 'left', 'right', 'bottom']
     if (whiteList.find((v) => v === key)) {
       if (typeof value === 'number') {
         return value + 'px'
diff --git a/src/utils/index.jsx b/src/utils/index.tsx
similarity index 80%
rename from src/utils/index.jsx
rename to src/utils/index.tsx
index 016a91e46..88b09a1a2 100644
--- a/src/utils/index.jsx
+++ b/src/utils/index.tsx
@@ -1,10 +1,10 @@
 import * as Vue from 'vue'
-import SelectDialog from '../components/dialog/SelectDialog'
-import SimpleConfirmDialog from '../components/dialog/SimpleConfirmDialog'
-import ConfirmDialog from '../components/dialog/ConfirmDialog'
+import SelectDialog from '../components/dialog/SelectDialog.vue'
+import SimpleConfirmDialog from '../components/dialog/SimpleConfirmDialog.vue'
+import ConfirmDialog from '../components/dialog/ConfirmDialog.vue'
 import Loading from '../components/Loading.vue'
-import Config, { IMG_URL } from '../config'
-import NoticeDialog from '../components/dialog/NoticeDialog'
+import Config, { IMG_URL, IS_DEV } from '../config'
+import NoticeDialog from '../components/dialog/NoticeDialog.vue'
 import dayjs from 'dayjs'
 import bus, { EVENT_KEY } from './bus'
 import { ArchiveReader, libarchiveWasm } from 'libarchive-wasm'
@@ -16,24 +16,24 @@ const Utils = {
         return <Loading />
       }
     })
-    let parent = document.createElement('div')
+    const parent = document.createElement('div')
     parent.classList.add(...['dialog-ctn'])
     document.body.append(parent)
     app.mount(parent)
   },
   $hideLoading() {
-    let parent = document.querySelector('.dialog-ctn')
+    const parent = document.querySelector('.dialog-ctn')
     parent.remove()
   },
   $showSelectDialog(sexList, cb) {
-    let remove = () => {
-      let parent = document.querySelector('.dialog-ctn')
+    const remove = () => {
+      const parent = document.querySelector('.dialog-ctn')
       parent.classList.replace('fade-in', 'fade-out')
       setTimeout(() => {
         parent.remove()
       }, 300)
     }
-    let tempCb = (e) => {
+    const tempCb = (e) => {
       remove()
       cb(e)
     }
@@ -42,7 +42,7 @@ const Utils = {
         return <SelectDialog onCancel={remove} list={sexList} onOk={tempCb} />
       }
     })
-    let parent = document.createElement('div')
+    const parent = document.createElement('div')
     parent.classList.add(...['dialog-ctn', 'fade-in'])
     document.body.append(parent)
     app.mount(parent)
@@ -51,18 +51,18 @@ const Utils = {
     if (!cancelCb) {
       cancelCb = () => {}
     }
-    let remove = () => {
-      let parent = document.querySelector('.dialog-ctn')
+    const remove = () => {
+      const parent = document.querySelector('.dialog-ctn')
       parent.classList.replace('fade-in', 'fade-out')
       setTimeout(() => {
         parent.remove()
       }, 300)
     }
-    let tempOkCb = (e) => {
+    const tempOkCb = (e) => {
       remove()
       okCb(e)
     }
-    let tempCancelCb = (e) => {
+    const tempCancelCb = (e) => {
       remove()
       cancelCb(e)
     }
@@ -80,7 +80,7 @@ const Utils = {
         )
       }
     })
-    let parent = document.createElement('div')
+    const parent = document.createElement('div')
     parent.classList.add(...['dialog-ctn', 'fade-in'])
     document.body.append(parent)
     app.mount(parent)
@@ -95,18 +95,18 @@ const Utils = {
     cancelText,
     cancelTextColor
   ) {
-    let remove = () => {
-      let parent = document.querySelector('.dialog-ctn')
+    const remove = () => {
+      const parent = document.querySelector('.dialog-ctn')
       parent.classList.replace('fade-in', 'fade-out')
       setTimeout(() => {
         parent.remove()
       }, 300)
     }
-    let tempOkCb = (e) => {
+    const tempOkCb = (e) => {
       remove()
       okCb && okCb(e)
     }
-    let tempCancelCb = (e) => {
+    const tempCancelCb = (e) => {
       remove()
       cancelCb && cancelCb(e)
     }
@@ -127,20 +127,20 @@ const Utils = {
         )
       }
     })
-    let parent = document.createElement('div')
+    const parent = document.createElement('div')
     parent.classList.add(...['dialog-ctn', 'fade-in'])
     document.body.append(parent)
     app.mount(parent)
   },
   $showNoticeDialog(title, subtitle, subtitleColor, cancelCb, cancelText) {
-    let remove = () => {
-      let parent = document.querySelector('.dialog-ctn')
+    const remove = () => {
+      const parent = document.querySelector('.dialog-ctn')
       parent.classList.replace('fade-in', 'fade-out')
       setTimeout(() => {
         parent.remove()
       }, 300)
     }
-    let tempCancelCb = (e) => {
+    const tempCancelCb = (e) => {
       remove()
       cancelCb(e)
     }
@@ -158,13 +158,13 @@ const Utils = {
         )
       }
     })
-    let parent = document.createElement('div')
+    const parent = document.createElement('div')
     parent.classList.add(...['dialog-ctn', 'fade-in'])
     document.body.append(parent)
     app.mount(parent)
   },
   $notice(val) {
-    let div = document.createElement('div')
+    const div = document.createElement('div')
     div.classList.add('global-notice')
     div.textContent = val
     document.body.append(div)
@@ -294,7 +294,7 @@ const Utils = {
     localStorage.setItem(key, JSON.stringify(value))
   },
   $storageGet(key, defaultValue = '') {
-    let res = localStorage.getItem(key)
+    const res = localStorage.getItem(key)
     if (res) {
       return JSON.parse(res)
     }
@@ -340,9 +340,9 @@ const Utils = {
     if (String(time).length === 10) {
       time = time * 1000
     }
-    let date = new dayjs(time)
-    let now = new dayjs()
-    let d = now.valueOf() - date.valueOf()
+    const date = new dayjs(time)
+    const now = new dayjs()
+    const d = now.valueOf() - date.valueOf()
     let str = ''
     if (d < 1000 * 60) {
       str = '刚刚'
@@ -365,16 +365,16 @@ const Utils = {
   },
   $duration(v) {
     if (!v) return '00:00'
-    let m = Math.floor(v / 60)
+    const m = Math.floor(v / 60)
     // let s = v % 60
-    let s = Math.round(v % 60)
-    let str = ''
+    const s = Math.round(v % 60)
+    let str: string = ''
     if (m === 0) {
       str = '00'
     } else if (m > 0 && m < 10) {
       str = '0' + m
     } else {
-      str = m
+      str = m + ''
     }
     str += ':'
     if (s === 0) {
@@ -406,13 +406,13 @@ const Utils = {
     return Math.hypot(stop.x - start.x, stop.y - start.y)
   },
   updateItem(props, key, val, emit) {
-    let old = cloneDeep(props.item)
+    const old = cloneDeep(props.item)
     old[key] = val
     emit('update:item', old)
     bus.emit(EVENT_KEY.UPDATE_ITEM, { position: props.position, item: old })
   },
   copy(val) {
-    let textarea = document.createElement('textarea')
+    const textarea = document.createElement('textarea')
     document.body.appendChild(textarea)
     textarea.style.position = 'absolute'
     textarea.style.clip = 'rect(0 0 0 0)'
@@ -433,7 +433,7 @@ export function _dateFormat(val, type) {
 }
 
 export function $no() {
-  Utils.$no(arguments)
+  Utils.$no()
 }
 
 export function $notice(val) {
@@ -496,10 +496,10 @@ export function random(min, max) {
 }
 
 export function sampleSize(arr, num) {
-  let list = []
-  let indexs = []
+  const list = []
+  const indexs = []
   while (list.length !== num) {
-    let j = random(0, arr.length - 1)
+    const j = random(0, arr.length - 1)
     if (!indexs.includes(j)) {
       list.push(arr[j])
       indexs.push(j)
@@ -514,26 +514,26 @@ export function _showLoading() {
       return <Loading />
     }
   })
-  let parent = document.createElement('div')
+  const parent = document.createElement('div')
   parent.classList.add(...['dialog-ctn'])
   document.body.append(parent)
   app.mount(parent)
 }
 
 export function _hideLoading() {
-  let parent = document.querySelector('.dialog-ctn')
+  const parent = document.querySelector('.dialog-ctn')
   parent.remove()
 }
 
 export function _showSelectDialog(sexList, cb) {
-  let remove = () => {
-    let parent = document.querySelector('.dialog-ctn')
+  const remove = () => {
+    const parent = document.querySelector('.dialog-ctn')
     parent.classList.replace('fade-in', 'fade-out')
     setTimeout(() => {
       parent.remove()
     }, 300)
   }
-  let tempCb = (e) => {
+  const tempCb = (e) => {
     remove()
     cb(e)
   }
@@ -542,7 +542,7 @@ export function _showSelectDialog(sexList, cb) {
       return <SelectDialog onCancel={remove} list={sexList} onOk={tempCb} />
     }
   })
-  let parent = document.createElement('div')
+  const parent = document.createElement('div')
   parent.classList.add(...['dialog-ctn', 'fade-in'])
   document.body.append(parent)
   app.mount(parent)
@@ -552,18 +552,18 @@ export function _showSimpleConfirmDialog(title, okCb, cancelCb, okText, cancelTe
   if (!cancelCb) {
     cancelCb = () => {}
   }
-  let remove = () => {
-    let parent = document.querySelector('.dialog-ctn')
+  const remove = () => {
+    const parent = document.querySelector('.dialog-ctn')
     parent.classList.replace('fade-in', 'fade-out')
     setTimeout(() => {
       parent.remove()
     }, 300)
   }
-  let tempOkCb = (e) => {
+  const tempOkCb = (e) => {
     remove()
     okCb(e)
   }
-  let tempCancelCb = (e) => {
+  const tempCancelCb = (e) => {
     remove()
     cancelCb(e)
   }
@@ -581,7 +581,7 @@ export function _showSimpleConfirmDialog(title, okCb, cancelCb, okText, cancelTe
       )
     }
   })
-  let parent = document.createElement('div')
+  const parent = document.createElement('div')
   parent.classList.add(...['dialog-ctn', 'fade-in'])
   document.body.append(parent)
   app.mount(parent)
@@ -597,18 +597,18 @@ export function _showConfirmDialog(
   cancelText,
   cancelTextColor
 ) {
-  let remove = () => {
-    let parent = document.querySelector('.dialog-ctn')
+  const remove = () => {
+    const parent = document.querySelector('.dialog-ctn')
     parent.classList.replace('fade-in', 'fade-out')
     setTimeout(() => {
       parent.remove()
     }, 300)
   }
-  let tempOkCb = (e) => {
+  const tempOkCb = (e) => {
     remove()
     okCb && okCb(e)
   }
-  let tempCancelCb = (e) => {
+  const tempCancelCb = (e) => {
     remove()
     cancelCb && cancelCb(e)
   }
@@ -629,21 +629,21 @@ export function _showConfirmDialog(
       )
     }
   })
-  let parent = document.createElement('div')
+  const parent = document.createElement('div')
   parent.classList.add(...['dialog-ctn', 'fade-in'])
   document.body.append(parent)
   app.mount(parent)
 }
 
 export function _showNoticeDialog(title, subtitle, subtitleColor, cancelCb, cancelText) {
-  let remove = () => {
-    let parent = document.querySelector('.dialog-ctn')
+  const remove = () => {
+    const parent = document.querySelector('.dialog-ctn')
     parent.classList.replace('fade-in', 'fade-out')
     setTimeout(() => {
       parent.remove()
     }, 300)
   }
-  let tempCancelCb = (e) => {
+  const tempCancelCb = (e) => {
     remove()
     cancelCb(e)
   }
@@ -661,14 +661,14 @@ export function _showNoticeDialog(title, subtitle, subtitleColor, cancelCb, canc
       )
     }
   })
-  let parent = document.createElement('div')
+  const parent = document.createElement('div')
   parent.classList.add(...['dialog-ctn', 'fade-in'])
   document.body.append(parent)
   app.mount(parent)
 }
 
 export function _notice(val) {
-  let div = document.createElement('div')
+  const div = document.createElement('div')
   div.classList.add('global-notice')
   div.textContent = val
   document.body.append(div)
@@ -682,34 +682,39 @@ export function _no() {
 }
 
 /**
- * 逃避国内某pages,因为json文件被提示有违禁词,json压缩成7z文件,7z和zip文件被屏蔽了,所以7z重命名为md
+ * 逃避国内某pages审查,因为json文件被提示有违禁词,json压缩成7z文件,7z和zip文件被屏蔽了,所以7z重命名为md
  * @param url
- * @returns {Promise<unknown>}
- * @private
+ * @returns Promise<{ json(): Promise<any> } | Response>
+ * @privateF
  */
-export async function _fetch(url) {
-  // eslint-disable-next-line no-async-promise-executor
-  return new Promise(async (resolve) => {
-    let r = await fetch(url)
-    if (url.includes('.md')) {
-      // console.time()
-      const data = await r.arrayBuffer()
-      const mod = await libarchiveWasm()
-      const reader = new ArchiveReader(mod, new Int8Array(data))
-      for (const entry of reader.entries()) {
-        if (entry.getPathname().endsWith('.json')) {
-          let data = new TextDecoder().decode(entry.readData())
-          resolve({
-            json() {
-              return Promise.resolve(JSON.parse(data))
-            }
-          })
+export async function _fetch(url: string): Promise<{ json(): Promise<any> } | Response> {
+  if (IS_DEV) {
+    url = url.replace('.md', '.json')
+    return fetch(url)
+  } else {
+    // eslint-disable-next-line no-async-promise-executor
+    return new Promise(async (resolve) => {
+      const r = await fetch(url)
+      if (url.includes('.md')) {
+        // console.time()
+        const data = await r.arrayBuffer()
+        const mod = await libarchiveWasm()
+        const reader = new ArchiveReader(mod, new Int8Array(data))
+        for (const entry of reader.entries()) {
+          if (entry.getPathname().endsWith('.json')) {
+            const data = new TextDecoder().decode(entry.readData())
+            resolve({
+              json() {
+                return Promise.resolve(JSON.parse(data))
+              }
+            })
+          }
+          // console.timeEnd()
         }
-        // console.timeEnd()
+        reader.free()
+      } else {
+        resolve(r)
       }
-      reader.free()
-    } else {
-      resolve(r)
-    }
-  })
+    })
+  }
 }
diff --git a/src/utils/mixin.js b/src/utils/mixin.ts
similarity index 79%
rename from src/utils/mixin.js
rename to src/utils/mixin.ts
index 26caa71bd..ac82397fa 100644
--- a/src/utils/mixin.js
+++ b/src/utils/mixin.ts
@@ -1,14 +1,13 @@
 import globalMethods from './index'
-import BaseHeader from '../components/BaseHeader'
-import SlideRowList from '../components/slide/SlideRowList'
-import SlideItem from '../components/slide/SlideItem'
-import Indicator from '../components/slide/Indicator'
-import BaseFooter from '../components/BaseFooter'
+import BaseHeader from '../components/BaseHeader.vue'
+import SlideItem from '../components/slide/SlideItem.vue'
+import Indicator from '../components/slide/Indicator.vue'
+import BaseFooter from '../components/BaseFooter.vue'
 import BaseMask from '../components/BaseMask.vue'
-import NoMore from '../components/NoMore'
-import Back from '../components/Back'
-import Loading from '../components/Loading'
-import BaseButton from '../components/BaseButton'
+import NoMore from '../components/NoMore.vue'
+import Back from '../components/Back.vue'
+import Loading from '../components/Loading.vue'
+import BaseButton from '../components/BaseButton.vue'
 import CONST_VAR from './const_var'
 import Dom from './dom'
 import bus, { EVENT_KEY } from './bus'
@@ -20,7 +19,6 @@ export default {
   components: {
     BaseHeader,
     SlideHorizontal,
-    SlideRowList,
     SlideItem,
     Indicator,
     BaseFooter,
@@ -58,7 +56,7 @@ export default {
         let pressTimer = null
         // 定义函数处理程序
         // 创建计时器( 1秒后执行函数 )
-        let start = (e) => {
+        const start = (e) => {
           if (e.type === 'click' && e.button !== 0) {
             return
           }
@@ -70,7 +68,7 @@ export default {
           }
         }
         // 取消计时器
-        let cancel = () => {
+        const cancel = () => {
           // 检查计时器是否有值
           if (pressTimer !== null) {
             clearTimeout(pressTimer)
@@ -115,16 +113,16 @@ export default {
         let clickTimer = null
         let dbClickTimer = null
         let lastClickTime = null
-        let checkTime = 200
-        let dbCheckCancelTime = 500
+        const checkTime = 200
+        const dbCheckCancelTime = 500
 
-        let dbClick = (e) => {
+        const dbClick = (e) => {
           // console.log('dbClick')
-          let id = 'a' + Date.now()
-          let elWidth = 80
-          let rotate = random(0, 1)
-          let template = `<img class="${rotate ? 'left love-dbclick' : 'right love-dbclick'}" id="${id}" src="${new URL('../assets/img/icon/loved.svg', import.meta.url).href}">`
-          let el = new Dom().create(template)
+          const id = 'a' + Date.now()
+          const elWidth = 80
+          const rotate = random(0, 1)
+          const template = `<img class="${rotate ? 'left love-dbclick' : 'right love-dbclick'}" id="${id}" src="${new URL('../assets/img/icon/loved.svg', import.meta.url).href}">`
+          const el = new Dom().create(template)
           el.css({ top: e.y - elWidth - 40, left: e.x - elWidth / 2 })
           new Dom(`#${binding.value}`).append(el)
           setTimeout(() => {
@@ -132,14 +130,14 @@ export default {
           }, 1000)
         }
 
-        let check = (e) => {
+        const check = (e) => {
           if (isDbClick) {
             clearTimeout(dbClickTimer)
             dbClick(e)
             dbClickTimer = setTimeout(() => (isDbClick = false), dbCheckCancelTime)
             return
           }
-          let nowTime = new Date().getTime()
+          const nowTime = new Date().getTime()
           if (nowTime - lastClickTime < checkTime) {
             clearTimeout(clickTimer)
             dbClick(e)
diff --git a/src/utils/request.ts b/src/utils/request.ts
index 46cad8213..26afe3d85 100644
--- a/src/utils/request.ts
+++ b/src/utils/request.ts
@@ -1,8 +1,8 @@
-import axios from 'axios'
+import axios, { type AxiosError, type AxiosRequestConfig, type AxiosResponse } from 'axios'
 import config from '@/config'
 import globalMethods from './index'
 
-const axiosInstance = axios.create({
+export const axiosInstance = axios.create({
   baseURL: config.baseUrl,
   timeout: 60000
 })
@@ -26,7 +26,7 @@ axiosInstance.interceptors.request.use(
  * 如果有问题,拦截器里会进行提示,然后返回{ code: Xxx, data:xxx }这种数据。在then里面总是会接收到
  * */
 axiosInstance.interceptors.response.use(
-  (response) => {
+  (response: AxiosResponse) => {
     // console.log('response',response)
     /*
      * 响应成功的拦截器,主要是对data作处理,如果没有返回data,那么会添加一个data字段,并把response.data的内容合并到data里面,然后返回
@@ -66,7 +66,7 @@ axiosInstance.interceptors.response.use(
       return data
     }
   },
-  (error) => {
+  (error: AxiosError) => {
     console.log('error', error)
     // console.log(error.response)
     // console.log(error.response.status)
@@ -89,7 +89,7 @@ axiosInstance.interceptors.response.use(
     if (error.response.status === 401) {
       return { success: false, code: 401, msg: '用户名或密码不正确', data: [] }
     } else {
-      const { data } = error.response
+      const data: any = error.response.data
       if (data === null || data === undefined) {
         globalMethods.$notice('请求失败,请稍后重试!')
         return { success: true, code: 200, data: [] }
@@ -110,4 +110,21 @@ axiosInstance.interceptors.response.use(
   }
 )
 
-export default axiosInstance
+export interface ApiResponse<T = any> {
+  data: T
+  success: boolean
+}
+
+export async function request<T = any>(config: AxiosRequestConfig): Promise<ApiResponse<T>> {
+  /*
+   *  then和catch里面返回的数据必须加as const,否则调用方无法推断出类型
+   * */
+  return axiosInstance
+    .request<T>(config)
+    .then(({ data }) => {
+      return { success: true, data } as const
+    })
+    .catch((err) => {
+      return { success: false, data: err } as const
+    })
+}