Browse Source

refactor(整个项目): 根据EsLint修改代码格式;修改部分组件名

根据Eslint更新部分变量名、代码逻辑,去除重复逻辑,修复错误逻辑;

更新eslintrc文件,使得eslint忽略对_开头变量的使用性检查

Table、Form、Dialog组件分别更名为:CustomTable、CustomForm、CustomDialog
fxs 6 months ago
parent
commit
896218e491
42 changed files with 263 additions and 223 deletions
  1. 6 0
      .eslintrc.cjs
  2. 3 3
      components.d.ts
  3. 2 2
      index.html
  4. 2 2
      src/components/common/CustomDialog.vue
  5. 13 8
      src/components/common/WithIconSelect.vue
  6. 2 2
      src/components/dataAnalysis/DropDownSelection.vue
  7. 2 1
      src/components/dataAnalysis/HeaderCard.vue
  8. 10 6
      src/components/dataAnalysis/StatisticText.vue
  9. 6 5
      src/components/dataAnalysis/TemporalTrend.vue
  10. 4 4
      src/components/form/CustomFilter.vue
  11. 1 1
      src/components/form/CustomForm.vue
  12. 2 2
      src/components/form/MyInput.vue
  13. 84 78
      src/components/table/CustomTable.vue
  14. 3 3
      src/components/table/TableFieldText.vue
  15. 6 1
      src/components/toolsBtn/FilterPopover.vue
  16. 3 3
      src/hooks/useCustomFilter.ts
  17. 1 1
      src/hooks/useDialog.ts
  18. 8 4
      src/hooks/useForm.ts
  19. 3 3
      src/hooks/useRequest.ts
  20. 30 26
      src/hooks/useTable.ts
  21. 1 1
      src/router/index.ts
  22. 1 1
      src/stores/useTable.ts
  23. 2 2
      src/utils/axios/axiosInstance.ts
  24. 0 13
      src/utils/common/index.ts
  25. 4 4
      src/utils/localStorage/localStorage.ts
  26. 7 4
      src/utils/resource/index.ts
  27. 10 6
      src/utils/table/table.ts
  28. 5 1
      src/views/AppManage/BaseInfoView.vue
  29. 4 4
      src/views/AppManage/EventDetailsView.vue
  30. 4 4
      src/views/AppManage/EventManageView.vue
  31. 2 2
      src/views/AppManage/EventMangeTable.vue
  32. 3 2
      src/views/AppManage/UserConversionDetail.vue
  33. 1 1
      src/views/AppManage/UserConversionTable.vue
  34. 4 4
      src/views/Home/Analysis/AdvertisingUsers.vue
  35. 1 1
      src/views/Home/Analysis/EventAnalysisDetail.vue
  36. 1 1
      src/views/Home/Analysis/EventAnalysisTable.vue
  37. 1 1
      src/views/Home/Analysis/KeepView.vue
  38. 4 4
      src/views/Home/Analysis/UserBehavior.vue
  39. 1 1
      src/views/Home/Analysis/UserTrendView.vue
  40. 2 2
      src/views/Home/InfoManage/GameManageView.vue
  41. 2 2
      src/views/Home/InfoManage/PlayerManageView.vue
  42. 12 7
      src/views/IndexView.vue

+ 6 - 0
.eslintrc.cjs

@@ -11,5 +11,11 @@ module.exports = {
   ],
   parserOptions: {
     ecmaVersion: 'latest'
+  },
+  rules: {
+    '@typescript-eslint/no-unused-vars': [
+      'error',
+      { varsIgnorePattern: '^_', argsIgnorePattern: '^_' }
+    ]
   }
 }

+ 3 - 3
components.d.ts

@@ -7,8 +7,10 @@ export {}
 /* prettier-ignore */
 declare module 'vue' {
   export interface GlobalComponents {
+    CustomDialog: typeof import('./src/components/common/CustomDialog.vue')['default']
     CustomFilter: typeof import('./src/components/form/CustomFilter.vue')['default']
-    Dialog: typeof import('./src/components/common/Dialog.vue')['default']
+    CustomForm: typeof import('./src/components/form/CustomForm.vue')['default']
+    CustomTable: typeof import('./src/components/table/CustomTable.vue')['default']
     DropDownSelection: typeof import('./src/components/dataAnalysis/DropDownSelection.vue')['default']
     ElButton: typeof import('element-plus/es')['ElButton']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
@@ -45,7 +47,6 @@ declare module 'vue' {
     ElUpload: typeof import('element-plus/es')['ElUpload']
     FileUpload: typeof import('./src/components/form/FileUpload.vue')['default']
     FilterPopover: typeof import('./src/components/toolsBtn/FilterPopover.vue')['default']
-    Form: typeof import('./src/components/form/Form.vue')['default']
     HeaderCard: typeof import('./src/components/dataAnalysis/HeaderCard.vue')['default']
     IconIcBaselineVisibility: typeof import('~icons/ic/baseline-visibility')['default']
     IconIcBaselineVisibilityOff: typeof import('~icons/ic/baseline-visibility-off')['default']
@@ -59,7 +60,6 @@ declare module 'vue' {
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
     StatisticText: typeof import('./src/components/dataAnalysis/StatisticText.vue')['default']
-    Table: typeof import('./src/components/table/Table.vue')['default']
     TableFieldText: typeof import('./src/components/table/TableFieldText.vue')['default']
     TemporalTrend: typeof import('./src/components/dataAnalysis/TemporalTrend.vue')['default']
     TimeLineChart: typeof import('./src/components/echarts/TimeLineChart.vue')['default']

+ 2 - 2
index.html

@@ -2,9 +2,9 @@
 <html lang="en">
   <head>
     <meta charset="UTF-8" />
-    <link rel="icon" href="/logoTest.svg" />
+    <link rel="icon" href="/logo.svg" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>测试库-淳皓游戏管理平台</title>
+    <title>淳皓游戏管理平台</title>
   </head>
   <body>
     <div id="app"></div>

+ 2 - 2
src/components/common/Dialog.vue → src/components/common/CustomDialog.vue

@@ -3,7 +3,7 @@
  * @Date: 2024-09-04 11:21:05
  * @LastEditors: fxs bjnsfxs@163.com
  * @LastEditTime: 2024-10-14 16:57:09
- * @FilePath: \Game-Backstage-Management-System\src\components\common\Dialog.vue
+ * @FilePath: \Game-Backstage-Management-System\src\components\common\CustomDialog.vue
  * @Description: 
  * 
 -->
@@ -14,7 +14,7 @@ import type { DialogConfig } from '@/types/dialog'
 import { useDialog } from '@/hooks/useDialog'
 import { nextTick, onMounted, reactive, ref } from 'vue'
 
-import Form from '../form/Form.vue'
+import Form from '../form/CustomForm.vue'
 
 interface DialogProps {
   config: DialogConfig

+ 13 - 8
src/components/common/WithIconSelect.vue

@@ -6,7 +6,12 @@ import { onMounted, ref, reactive, watch } from 'vue'
 import { initLoadResource } from '@/utils/resource'
 import { useCommonStore } from '@/stores/useCommon'
 
-const { selectInfo, tempMultipleChoice, saveSelectInfo, saveTempMultipleChoice } = useCommonStore()
+const {
+  selectInfo: userSelectInfo,
+  tempMultipleChoice,
+  saveSelectInfo,
+  saveTempMultipleChoice
+} = useCommonStore()
 
 interface DropdownInfo {
   isRadio?: boolean // 是否是单选
@@ -35,7 +40,7 @@ const selectBaseInfo = reactive<Array<IconDropdownItem>>(
 const isConfirmClose = ref<Boolean>(false)
 
 // emits
-const emits = defineEmits(['changePf'])
+defineEmits(['changePf'])
 
 // 下拉框
 const dropDownRef = ref<DropdownInstance>()
@@ -115,8 +120,8 @@ const dropdownVis = (state: boolean) => {
  */
 const selectPf = (item: any) => {
   if (props.isRadio) {
-    selectInfo.pf = []
-    selectInfo.pf.push(item.value)
+    userSelectInfo.pf = []
+    userSelectInfo.pf.push(item.value)
 
     saveSelectInfo() // 选择之后保存到本地一次
   } else {
@@ -130,7 +135,7 @@ const selectPf = (item: any) => {
  */
 const syncSelectInfo = () => {
   selectBaseInfo.forEach((item) => {
-    item.isSelected = selectInfo.pf.includes(item.value)
+    item.isSelected = userSelectInfo.pf.includes(item.value)
   })
 }
 
@@ -147,7 +152,7 @@ const syncTempMultipleChoice = () => {
  * @description: 监听selectInfo的变化,然后同步到页面上
  */
 const watchSelectPf = watch(
-  () => selectInfo.pf,
+  () => userSelectInfo.pf,
   () => {
     syncSelectInfo()
   },
@@ -200,7 +205,7 @@ onMounted(() => {
     >
       <div class="displayBox">
         <div class="displayIcon">
-          <span class="iconItem" v-for="item in selectBaseInfo">
+          <span class="iconItem" v-for="item in selectBaseInfo" :key="item.label">
             <el-image
               v-show="item.isSelected"
               style="width: 20px; height: 20px; margin-right: 5px"
@@ -229,7 +234,7 @@ onMounted(() => {
               :fit="'cover'"
             />
             <!-- 禁用掉原生的点击事件,自己实现点击 -->
-            <el-checkbox v-model="item.isSelected" size="small" @click.native.prevent />
+            <el-checkbox v-model="item.isSelected" size="small" @click.prevent />
           </el-dropdown-item>
         </el-dropdown-menu>
         <span class="btnGroup" v-if="!isRadio">

+ 2 - 2
src/components/dataAnalysis/DropDownSelection.vue

@@ -2,7 +2,7 @@
  * @Author: fxs bjnsfxs@163.com
  * @Date: 2024-08-23 14:42:47
  * @LastEditors: fxs bjnsfxs@163.com
- * @LastEditTime: 2024-10-11 15:34:29
+ * @LastEditTime: 2024-11-28
  * @FilePath: \Game-Backstage-Management-System\src\components\dataAnalysis\DropDownSelection.vue
  * @Description: 下拉选择框,可用于分类字段或者切换平台等
  * 
@@ -37,7 +37,7 @@ onMounted(() => {
       v-model="selectVal"
       :placeholder="title"
       filterable
-      :size="props.size ? props.size : 'small'"
+      v-bind="$attrs"
     >
       <el-option
         v-for="item in optionsList"

+ 2 - 1
src/components/dataAnalysis/HeaderCard.vue

@@ -81,7 +81,7 @@ const breadcrumbCanClick = computed(() => breadcrumbList.length > 1)
  * @param {*} index 当前面包屑的下标
  */
 const goBack = (index: number) => {
-  if (breadcrumbCanClick) {
+  if (breadcrumbCanClick.value) {
     router.push(breadcrumbList[index].pathName).then(() => {
       breadcrumbList.splice(index + 1, breadcrumbList.length - 1)
     })
@@ -163,6 +163,7 @@ onMounted(() => {
       <span
         @click="breadcrumbCanClick ? goBack(index) : ''"
         v-for="(item, index) in breadcrumbList"
+        :key="item.title"
         :class="[
           index === breadcrumbList.length - 1 ? 'activeCrumbs' : 'noActive',
           breadcrumbCanClick ? 'canClick' : 'unAble'

+ 10 - 6
src/components/dataAnalysis/StatisticText.vue

@@ -38,19 +38,23 @@ const getData = async () => {
       let data = info.data
       newDataList = createDataList(props.fieldsInfo, (item) => data[item.name])
     } else {
-      let hasNull = props.fieldsInfo.every((item) => item.value !== '')
-
-      if (!hasNull) throw new Error('全为空')
+      let hasEmptyField = props.fieldsInfo.some((item) => item.value === '')
+      if (hasEmptyField) {
+        console.warn('数据为空')
+        dataState.value = false
+        return
+      }
 
       newDataList = createDataList(props.fieldsInfo, (item) => item.value)
     }
+
     dataList.splice(0, dataList.length, ...newDataList)
 
     dataState.value = true // 标记成功
   } catch (err) {
-    console.log(err)
     dataState.value = false
-    throw new Error('数据获取失败')
+    console.error(err)
+    // throw new Error('数据获取失败')
   }
 }
 
@@ -84,7 +88,7 @@ onMounted(() => {
 <template>
   <div class="dataBox">
     <div class="dataBody" v-if="dataState">
-      <div class="dataItem" v-for="item in dataList">
+      <div class="dataItem" v-for="item in dataList" :key="item.name">
         <div class="header">
           <span :class="titleClass ? titleClass : 'dataTitle'">{{ item.cnName }}</span>
         </div>

+ 6 - 5
src/components/dataAnalysis/TemporalTrend.vue

@@ -12,7 +12,7 @@ import type { TablePaginationSetting, TableFieldInfo } from '@/types/table'
 
 import { nextTick, onMounted, reactive, ref, watch } from 'vue'
 
-import Table from '../table/Table.vue'
+import Table from '../table/CustomTable.vue'
 import TimeLineChart from '../echarts/TimeLineChart.vue'
 import StatisticText from './StatisticText.vue'
 import axiosInstance from '@/utils/axios/axiosInstance'
@@ -153,8 +153,9 @@ const createTableData = (data: any) => {
     })
     newList.push(newItem)
   }
-  tableDataList.splice(0, tableDataList.length, ...newList)
 
+  tableDataList.splice(0, tableDataList.length, ...newList)
+  console.log(JSON.parse(JSON.stringify(tableDataList)))
   paginationConfig.total = xInfo.length
 }
 
@@ -188,7 +189,6 @@ const createOptions = (data: any) => {
 /**
  * @description: 有tab页的情况下对数据进行缓存
  */
-
 const setCacheData = (isUse: boolean = false) => {
   if (isUse) {
     // 使用缓存
@@ -250,6 +250,7 @@ const getData = async (type: number) => {
         chartInfo = reactive<OptionsProps>({ ...initChartInfo })
 
         tableDataList.splice(0, tableDataList.length)
+
         tableFieldsInfo.splice(0, tableFieldsInfo.length)
         statisticFieldsInfo.splice(0, statisticFieldsInfo.length)
       } else {
@@ -312,7 +313,6 @@ Object.assign(requestInfo, props.requestConfig)
  * @description: 监听请求参数的变化,有变化了之后重新请求数据,并且把tab置为第一个
  * @return {*}
  */
-
 watch(
   () => [requestInfo.otherOptions],
   () => {
@@ -389,7 +389,8 @@ onMounted(() => {
             :table-fields-info="tableFieldsInfo"
             :need-left-tools="false"
             :open-filter-query="false"
-            :open-page-query="false"
+            :open-remote-query="false"
+            :open-page-query="true"
           ></Table>
         </div>
       </el-tabs>

+ 4 - 4
src/components/form/CustomFilter.vue

@@ -5,7 +5,7 @@ import { reactive } from 'vue'
 
 const props = defineProps<{
   filter: CustomFilter // 当前过滤条件
-  filterList: Array<FilterItem> // 过滤条件的值列表
+  customFilterList: Array<FilterItem> // 过滤条件的值列表
 }>()
 
 // 筛选条件
@@ -47,8 +47,8 @@ const filterList = reactive<
  * 初始化过滤条件的列表
  */
 const initFilterList = () => {
-  console.log(props.filterList)
-  filterList.splice(0, filterList.length, ...props.filterList)
+  console.log(props.customFilterList)
+  filterList.splice(0, filterList.length, ...props.customFilterList)
 }
 
 /**
@@ -155,7 +155,7 @@ defineExpose({
       </div>
     </div>
     <div class="filterContainer">
-      <div class="filterItem" v-for="(item, index) in filterList">
+      <div class="filterItem" v-for="(item, index) in filterList" :key="index">
         <div class="filterCondition">
           <el-select
             style="width: 240px"

+ 1 - 1
src/components/form/Form.vue → src/components/form/CustomForm.vue

@@ -155,7 +155,7 @@ defineExpose({
       :label-width="'auto'"
       :disabled="!props.disabled"
     >
-      <template v-for="item in props.config.fieldsInfo">
+      <template v-for="item in props.config.fieldsInfo" :key="item.name">
         <el-form-item
           :prop="item.name"
           :label="item.cnName"

+ 2 - 2
src/components/form/MyInput.vue

@@ -2,7 +2,7 @@
  * @Author: fxs bjnsfxs@163.com
  * @Date: 2024-08-22 17:31:50
  * @LastEditors: fxs bjnsfxs@163.com
- * @LastEditTime: 2024-10-14 17:04:09
+ * @LastEditTime: 2024-11-28
  * @FilePath: \Game-Backstage-Management-System\src\components\form\MyInput.vue
  * @Description: 
  * 
@@ -24,7 +24,7 @@ const model = defineModel()
 const props = defineProps<InputInfo>()
 
 // 通过update去更新props上的v-model数据
-const emits = defineEmits(['validateInput'])
+defineEmits(['validateInput'])
 
 let inputType = ref(props.pInputType) // 主要用于更改password框的类型,因为props的type是只读的,所以额外创建一个
 

+ 84 - 78
src/components/table/Table.vue → src/components/table/CustomTable.vue

@@ -2,7 +2,7 @@
  * @Author: fxs bjnsfxs@163.com
  * @Date: 2024-08-20 18:16:18
  * @LastEditors: fxs bjnsfxs@163.com
- * @LastEditTime: 2024-11-27
+ * @LastEditTime: 2024-11-28
  * @Description: 
  * 
 -->
@@ -172,88 +172,74 @@ const handleSizeChange = (val: number) => {
  * @description 加载表格数据
  */
 const loadTableData = async (): Promise<boolean> => {
-  return new Promise(async (resolve, reject) => {
-    loading.value = true
+  loading.value = true
+
+  try {
     // 如果是直接传入的数据
     if (props.dataList) {
       tableData.splice(0, tableData.length, ...props.dataList)
       if (props.paginationConfig) {
         paginationConfig.total = props.paginationConfig.total
       }
+      return true
+    }
 
-      loading.value = false
-
-      resolve(true)
-    } else {
-      // 如果是需要表格自己请求数据的
-      if (props.requestConfig) {
-        try {
-          // 如果开启了分页查询,那么要计算出需要展示的页码位置所对应的偏移量
-          // 同时要将查询的条数改为对应的用户选择的展示条数
-
-          if (props.openRemoteQuery) {
-            reqConfig.otherOptions.offset =
-              (paginationConfig.currentPage - 1) * paginationConfig.limit
-            reqConfig.otherOptions.limit = paginationConfig.limit
-          }
-          // console.log(reqConfig.otherOptions)
-          await getTableData(reqConfig.url, reqConfig.otherOptions, props.openRemoteQuery)
-
-          backupTableData.splice(0, backupTableData.length, ...tableData)
-          resolve(true)
-        } catch (err) {
-          console.log(err)
-          reject(err)
-        } finally {
-          loading.value = false
-        }
-      } else {
-        loading.value = false
-
-        throw new Error('no match requestConfig')
+    // 如果需要表格自己请求数据的
+    if (props.requestConfig) {
+      if (props.openRemoteQuery) {
+        reqConfig.otherOptions.offset = (paginationConfig.currentPage - 1) * paginationConfig.limit
+        reqConfig.otherOptions.limit = paginationConfig.limit
       }
+
+      await getTableData(reqConfig.url, reqConfig.otherOptions, props.openRemoteQuery)
+      backupTableData.splice(0, backupTableData.length, ...tableData)
+      return true
     }
-  })
+
+    // 如果 dataList 和 requestConfig 都没有传入,返回 false
+    console.warn('Both dataList and requestConfig are undefined. Returning early.')
+    return false
+  } catch (err) {
+    console.error('Error while loading table data:', err)
+    return false // 确保返回 false 表示失败
+  } finally {
+    loading.value = false // 确保 loading 状态被正确重置
+  }
 }
 
 /**
  * @description: 获取数据,如果没有直接传入数据,则去请求数据,有则直接用
- * @return Promise
  */
-const getData = () => {
-  return new Promise(async (resolve, reject) => {
-    try {
-      // 等待数据加载完成
-      await loadTableData()
-      // 如果需要平均值字段,则需要在表格头部插入一行计算平均值
-      if (props.needAverage) {
-        let rowData: any = {}
-        let oldList: Array<any> = JSON.parse(JSON.stringify(tableData))
-        Object.values(props.tableFieldsInfo).map((item: TableFieldInfo, index: number) => {
-          let sum = oldList
-            .map((item) => item.count)
-            .reduce((accumulator, currentValue) => accumulator + currentValue, 0)
-          let averageList = oldList
-            .map((val) => val[item.name])
-            .filter((item) => item !== undefined)
-          if (index === 0) rowData[item.name] = '均值'
-          else if (item.name === 'count') rowData[item.name] = sum
-          else {
-            let num =
-              averageList.reduce((accumulator, currentValue) => accumulator + currentValue, 0) /
-              averageList.length
-
-            rowData[item.name] = isNaN(num) ? 0 : num.toFixed(2)
-          }
-        })
-        insertRow(0, rowData)
-      }
-      resolve(true)
-    } catch (err) {
-      console.log(err)
-      reject(err)
+const getData = async () => {
+  try {
+    // 等待数据加载完成
+    await loadTableData()
+    // 如果需要平均值字段,则需要在表格头部插入一行计算平均值
+    if (props.needAverage) {
+      let rowData: any = {}
+      let oldList: Array<any> = JSON.parse(JSON.stringify(tableData))
+      Object.values(props.tableFieldsInfo).map((item: TableFieldInfo, index: number) => {
+        let sum = oldList
+          .map((item) => item.count)
+          .reduce((accumulator, currentValue) => accumulator + currentValue, 0)
+        let averageList = oldList.map((val) => val[item.name]).filter((item) => item !== undefined)
+        if (index === 0) rowData[item.name] = '均值'
+        else if (item.name === 'count') rowData[item.name] = sum
+        else {
+          let num =
+            averageList.reduce((accumulator, currentValue) => accumulator + currentValue, 0) /
+            averageList.length
+
+          rowData[item.name] = isNaN(num) ? 0 : num.toFixed(2)
+        }
+      })
+      insertRow(0, rowData)
     }
-  })
+    return true
+  } catch (err) {
+    console.log(err)
+    return false
+  }
 }
 
 // 包装一下获取数据
@@ -623,10 +609,10 @@ onMounted(() => {
           class="queryForm"
           :label-position="'left'"
         >
-          <template v-for="item in inputFieldsList">
+          <template v-for="item in inputFieldsList" :key="item.name">
             <!-- 所有的input查询框 -->
             <el-form-item
-              @keyup.enter.native="throttleQueryTableData"
+              @keyup.enter="throttleQueryTableData"
               :label="item.label"
               v-if="item.valueType !== 'int'"
               class="filterItem"
@@ -638,7 +624,7 @@ onMounted(() => {
               />
             </el-form-item>
             <el-form-item
-              @keyup.enter.native="throttleQueryTableData"
+              @keyup.enter="throttleQueryTableData"
               :label="item.label"
               v-else
               class="filterItem"
@@ -653,19 +639,34 @@ onMounted(() => {
           </template>
 
           <!-- 所有选择框 -->
-          <el-form-item :label="item.label" v-for="item in selectFieldsList" class="filterItem">
+          <el-form-item
+            :label="item.label"
+            v-for="item in selectFieldsList"
+            :key="item.name"
+            class="filterItem"
+          >
             <el-select
               :empty-values="[undefined, null]"
               v-model="queryFormData[item.name]"
               :placeholder="item.placeholder"
               :value-key="item.name"
             >
-              <el-option v-for="val in item.otherOption" :label="val.cnName" :value="val.value" />
+              <el-option
+                v-for="val in item.otherOption"
+                :key="val.name"
+                :label="val.cnName"
+                :value="val.value"
+              />
             </el-select>
           </el-form-item>
 
           <!-- 所有日期选择框 -->
-          <el-form-item :label="item.label" v-for="item in dateFieldsList" class="filterItem">
+          <el-form-item
+            :label="item.label"
+            v-for="item in dateFieldsList"
+            :key="item.name"
+            class="filterItem"
+          >
             <el-date-picker
               v-model="queryFormData[item.name]"
               type="date"
@@ -676,7 +677,12 @@ onMounted(() => {
           </el-form-item>
 
           <!-- 所有自定义筛选条件 -->
-          <el-form-item :label="item.label" v-for="item in customFieldsList" class="filterItem">
+          <el-form-item
+            :label="item.label"
+            v-for="item in customFieldsList"
+            :key="item.name"
+            class="filterItem"
+          >
             <el-button plain size="default" :icon="Filter" @click="openCustomFilter(item)"
               >筛选
             </el-button>
@@ -703,7 +709,7 @@ onMounted(() => {
         </div>
         <el-dialog v-model="customFilterDialog" title="自定义筛选条件" width="800">
           <CustomFilter
-            :filter-list="customFilterList[activeCustomFilterKey]"
+            :custom-filter-list="customFilterList[activeCustomFilterKey]"
             :filter="customFilterInfo[activeCustomFilterKey]"
             ref="customFilterRef"
           ></CustomFilter>
@@ -788,7 +794,7 @@ onMounted(() => {
           type="index"
           :index="computedRowIndex"
         />
-        <template v-for="item in tableFieldsInfo">
+        <template v-for="item in tableFieldsInfo" :key="item.name">
           <el-table-column
             :prop="item.name"
             :label="item.cnName"
@@ -869,7 +875,7 @@ onMounted(() => {
           table-layout="fixed"
           layout="prev, pager, next ,jumper ,sizes,total,"
           :total="paginationConfig.total"
-          :current-page.sync="paginationConfig.currentPage"
+          :current-page="paginationConfig.currentPage"
           @current-change="handleCurrentChange"
           @size-change="handleSizeChange"
         />

+ 3 - 3
src/components/table/TableFieldText.vue

@@ -104,7 +104,7 @@ const getTableTextFieldVal = (): any => {
     if (isArrTranslateMap()) {
       // 处理数组情况:根据 `val` 的布尔值选择翻译映射中的第一个或第二个元素
       let translateMap = props.specialEffect!.otherInfo.translateMap!
-      val = Boolean(val) ? translateMap[0] : translateMap[1]
+      val = val ? translateMap[0] : translateMap[1]
     } else {
       // 处理对象情况:根据 `val` 获取 `translateMap` 中对应的键值
       val = props.specialEffect!.otherInfo.translateMap![val]
@@ -174,7 +174,7 @@ const tableTextColor = computed<string>(() => {
   if (hasSpecialEffect() && hasColor()) {
     if (isArrColor()) {
       let colorList = props.specialEffect!.otherInfo.color! as Array<string>
-      color = Boolean(val) ? colorList[0] : colorList[1]
+      color = val ? colorList[0] : colorList[1]
     } else if (typeof val === 'string') {
       color = props.specialEffect!.otherInfo.color as string
     } else {
@@ -198,7 +198,7 @@ const tableTag = computed<TagType>(() => {
   let val = props.value
   if (hasSpecialEffect() && hasTag()) {
     let tagList = props.specialEffect!.otherInfo.tagType!
-    tagType = Boolean(val) ? tagList[0] : tagList[1]
+    tagType = val ? tagList[0] : tagList[1]
   }
   return tagType
 })

+ 6 - 1
src/components/toolsBtn/FilterPopover.vue

@@ -20,7 +20,12 @@ defineProps<SettingInfo>()
         </template>
         <!-- 这里不是使用value是v-model去绑定数据 -->
         <!-- 这里有点奇怪,按理说是不能这样绑定的 -->
-        <el-checkbox v-for="item in tableFieldsInfo" :label="item.cnName" v-model="item.isShow" />
+        <el-checkbox
+          v-for="item in tableFieldsInfo"
+          :key="item.name"
+          :label="item.cnName"
+          v-model="item.isShow"
+        />
       </el-popover>
     </span>
   </el-tooltip>

+ 3 - 3
src/hooks/useCustomFilter.ts

@@ -78,7 +78,7 @@ export function useCustomFilter(customFilterRef: Ref<CustomFilterRef | undefined
         }
       ]
 
-      let customFilterItem = createCustomFilterItem(item)
+      const customFilterItem = createCustomFilterItem(item)
       if (customFilterItem !== false) {
         customFilterInfo[item.name] = customFilterItem
       }
@@ -111,7 +111,7 @@ export function useCustomFilter(customFilterRef: Ref<CustomFilterRef | undefined
       value: any
     }>
   ) => {
-    let result: Record<string, any> = {}
+    const result: Record<string, any> = {}
     filterList.forEach((item) => {
       result[item.filterCondition] = item.value
     })
@@ -127,7 +127,7 @@ export function useCustomFilter(customFilterRef: Ref<CustomFilterRef | undefined
   const confirmCustomFilter = (queryFormData: Reactive<Record<string, any>>) => {
     if (customFilterRef.value && customFilterRef.value.verifySub()) {
       customFilterDialog.value = false
-      let result = customFilterRef.value.getSubCondition()
+      const result = customFilterRef.value.getSubCondition()
       // 拿到数据后,需要转为查询参数
       queryFormData[activeCustomFilterKey.value] = conversionCustomFilter(result)
       // 保存筛选值

+ 1 - 1
src/hooks/useDialog.ts

@@ -11,7 +11,7 @@ import type { DialogSetting } from '@/types/table'
 
 import { nextTick } from 'vue'
 
-import Form from '@/components/form/Form.vue'
+import Form from '@/components/form/CustomForm.vue'
 
 import 'element-plus/theme-chalk/el-message.css'
 import 'element-plus/theme-chalk/el-message-box.css'

+ 8 - 4
src/hooks/useForm.ts

@@ -36,11 +36,15 @@ export function useForm() {
       })
         .then(async () => {
           try {
-            let valid = await validForm(formEl)
-            if (!valid) throw new Error('表单校验不通过')
+            const valid = await validForm(formEl)
+            if (!valid) {
+              console.log('表单校验不通过')
+              reject(false)
+              return
+            }
 
-            let result = await axiosInstance.post(url, formData)
-            let info = JSON.parse(JSON.stringify(result))
+            const result = await axiosInstance.post(url, formData)
+            const info = JSON.parse(JSON.stringify(result))
 
             await analysisResCode(info)
             resolve(true)

+ 3 - 3
src/hooks/useRequest.ts

@@ -18,7 +18,7 @@ import 'element-plus/theme-chalk/el-message.css'
 import 'element-plus/theme-chalk/el-message-box.css'
 
 export function useRequest() {
-  let baseURL = BASE_URL
+  const baseURL = BASE_URL
 
   const AllApi = {
     getGameTable: `/user/getGidConfig`, // 获取游戏列表
@@ -80,11 +80,11 @@ export function useRequest() {
     showMsg = true
   ): Promise<ResponseInfo> => {
     return new Promise((resolve, reject) => {
-      let info = JSON.parse(JSON.stringify(data)) as ResponseInfo
+      const info = JSON.parse(JSON.stringify(data)) as ResponseInfo
 
       let type: MessageType = MessageType.Success
       let message = info.msg
-      let kindText = kind === 'login' ? '登录' : '请求'
+      const kindText = kind === 'login' ? '登录' : '请求'
       switch (info.code) {
         case 0:
           {

+ 30 - 26
src/hooks/useTable.ts

@@ -2,7 +2,7 @@
  * @Author: fxs bjnsfxs@163.com
  * @Date: 2024-08-20 17:15:49
  * @LastEditors: fxs bjnsfxs@163.com
- * @LastEditTime: 2024-10-16 10:54:55
+ * @LastEditTime: 2024-11-28
  * @Description:
  *
  */
@@ -48,34 +48,38 @@ export function useTable(tableData: Array<any>, paginationSetting: TablePaginati
    * @param {any} option 请求参数
    * @param {boolean} isPagination 是否开启分页
    */
-  const getTableData = (url: string, option: any, isPagination: boolean = false) => {
-    return new Promise(async (resolve, reject) => {
-      try {
-        await axiosInstance.post(url, option).then(async (result) => {
-          let info = JSON.parse(JSON.stringify(result)) as ResponseInfo
-          let data = info.data
+  const getTableData = async (
+    url: string,
+    option: Record<string, any>,
+    isPagination: boolean = false
+  ): Promise<boolean> => {
+    try {
+      const result = await axiosInstance.post<any, ResponseInfo>(url, option)
+      let data = result.data
 
-          // 没有数据则直接置为空
-          if (!data) {
-            tableData.length = 0
-            paginationSetting.total = 0
-          } else {
-            paginationSetting.total = info.count ?? data.length
-            data = setDefaultHead(data)
-            // 如果开启了分页,那么默认这个tableData是一个二维数组,每个位置对应当页的一个数据数组
-            // 没开启则是一个一维数组,直接赋值
-            if (isPagination) tableData[paginationSetting.currentPage] = data
-            else tableData.splice(0, tableData.length, ...data)
-          }
+      console.log(result)
+      // 没有数据则直接置为空
+      if (!data) {
+        tableData.length = 0
+        paginationSetting.total = 0
+      } else {
+        paginationSetting.total = result.count ?? data.length
+        data = setDefaultHead(data)
 
-          resolve(true)
-        })
-      } catch (err) {
-        console.log(err)
-        reject(err)
-        throw new Error('网络请求错误')
+        // 如果开启了分页,设置 tableData 为二维数组,否则为一维数组
+        const pageIndex = paginationSetting.currentPage ?? 0
+        if (isPagination) {
+          tableData[pageIndex] = data
+        } else {
+          tableData.splice(0, tableData.length, ...data)
+        }
       }
-    })
+
+      return true // 返回操作成功
+    } catch (err) {
+      console.error('网络请求错误:', err)
+      throw err // 抛出错误让调用者处理
+    }
   }
 
   return {

+ 1 - 1
src/router/index.ts

@@ -20,7 +20,7 @@ const routes = [
     path: '/index',
     name: 'Index',
     redirect: '/home/overView',
-    component: () => import('@/views/Index.vue'),
+    component: () => import('@/views/IndexView.vue'),
     children: [...HomeRoutes, ...AppManage]
   },
   {

+ 1 - 1
src/stores/useTable.ts

@@ -30,7 +30,7 @@ export const useTableStore = defineStore('tableStore', () => {
   }
 
   // 所有的游戏信息
-  let allGameInfo = reactive<Array<QueryGameInfo>>([])
+  const allGameInfo = reactive<Array<QueryGameInfo>>([])
 
   const setGameInfo = (list: Array<QueryGameInfo>) => {
     // allGameInfo = list

+ 2 - 2
src/utils/axios/axiosInstance.ts

@@ -104,8 +104,8 @@ axiosInstance.interceptors.response.use(
     return response.data
   },
   function (error) {
-    let code = error.response.data.code
-    let msg = errorCodeMsg[code] ?? '服务器错误,请稍后再试'
+    const code = error.response.data.code
+    const msg = errorCodeMsg[code] ?? '服务器错误,请稍后再试'
 
     // 对响应错误做点什么
     ElMessage({

+ 0 - 13
src/utils/common/index.ts

@@ -122,19 +122,6 @@ export const createDateRange = (day: number): [Date, Date] => {
 }
 
 /**
- * 判断日期范围是否有效
- *
- * @param {string} startTime 开始时间
- * @param {string} endTime 结束时间
- */
-export const invalidDateRange = (startTime: string, endTime: string): boolean => {
-  const start = new Date(startTime).getTime()
-  const end = new Date(endTime).getTime()
-  // 判断日期是否有效,`isNaN` 判断生成的时间是否为 "Invalid Date"
-  return !isNaN(start) && !isNaN(end) && start < end
-}
-
-/**
  * 将时间戳转为日期字符串yyyy-MM-dd HH:mm:ss
  *
  * 根据isMilliseconds参数判断是否为毫秒,默认为秒级时间戳

+ 4 - 4
src/utils/localStorage/localStorage.ts

@@ -4,10 +4,10 @@
  * @param {string} prop 属性名,不传就返回整个对象
  */
 const getLocalInfo = (name: string, prop?: string): string | string[] => {
-  let info = localStorage.getItem(name)
+  const info = localStorage.getItem(name)
   let result = ''
   if (info) {
-    let jsonInfo = JSON.parse(info)
+    const jsonInfo = JSON.parse(info)
 
     if (prop) result = jsonInfo[prop]
     else result = jsonInfo
@@ -23,9 +23,9 @@ const getLocalInfo = (name: string, prop?: string): string | string[] => {
  * @param {string} prop 属性名
  */
 const saveLocalInfo = (name: string, value: any, prop?: string) => {
-  let info = localStorage.getItem(name)
+  const info = localStorage.getItem(name)
   if (info) {
-    let jsonInfo = JSON.parse(info)
+    const jsonInfo = JSON.parse(info)
     if (prop) jsonInfo[prop] = value
     localStorage.setItem(name, JSON.stringify(jsonInfo))
   } else {

+ 7 - 4
src/utils/resource/index.ts

@@ -27,7 +27,10 @@ export const loadResource = async (url: string): Promise<string> => {
   // 如果没有缓存则去请求这个资源,并将他转为blob对象,并且缓存blob对象的ulr
   try {
     const resourceBlob = await fetch(url)
-    if (!resourceBlob.ok) throw new Error(`资源加载失败: ${url}`)
+    if (!resourceBlob.ok) {
+      console.log(`资源加载失败: ${url}`)
+      return ''
+    }
     const blob = await resourceBlob.blob()
     const objectURL = URL.createObjectURL(blob)
     resourceCache[url] = objectURL
@@ -46,10 +49,10 @@ export const initLoadResource = async (
   resourceObj: Record<string, string>
 ): Promise<Record<string, string>> => {
   // 获取所有的 URL 列表
-  let urlList = Object.entries(resourceObj) // [key, url] 格式
+  const urlList = Object.entries(resourceObj) // [key, url] 格式
 
   // 创建请求列表
-  let reqList: Promise<[string, string | null]>[] = urlList.map(([key, url]) =>
+  const reqList: Promise<[string, string | null]>[] = urlList.map(([key, url]) =>
     loadResource(url)
       .then((objectURL) => [key, objectURL] as [string, string])
       .catch(() => [key, null] as [string, string | null])
@@ -58,7 +61,7 @@ export const initLoadResource = async (
   // 使用 Promise.all 处理所有请求
   return Promise.all(reqList).then((results) => {
     // 创建返回对象
-    let resultObj: Record<string, string> = {}
+    const resultObj: Record<string, string> = {}
     results.forEach(([key, value]) => {
       if (value !== null) {
         resultObj[key] = value // 如果成功,存入结果对象中

+ 10 - 6
src/utils/table/table.ts

@@ -15,7 +15,7 @@ const formatGameInfo = (data: Array<any>, code: number): Array<any> => {
   const returnData: Array<any> = []
 
   if (code === 0 && Array.isArray(data)) {
-    let gameInfoList = data.map((item) => {
+    const gameInfoList = data.map((item) => {
       return { gid: item.gid, gameName: item.gameName }
     })
     returnData.splice(0, returnData.length, ...gameInfoList)
@@ -38,7 +38,10 @@ export const getAllGameInfo = async () => {
     const response = (await axiosInstance.post(AllApi.getGameTable, {
       appSecret: '6YJSuc50uJ18zj45'
     })) as ResponseInfo
-    if (!response || response.code !== 0) throw new Error('获取游戏列表失败')
+    if (!response || response.code !== 0) {
+      console.log('获取游戏列表失败')
+      return []
+    }
     const result = JSON.parse(JSON.stringify(response))
     const data = result.data
     const returnData: Array<any> = formatGameInfo(data, result.code)
@@ -47,6 +50,7 @@ export const getAllGameInfo = async () => {
     return returnData
   } catch (err) {
     console.log(err)
+    return []
     // throw new Error('获取游戏列表失败')
   }
 }
@@ -66,12 +70,12 @@ export const shouldListenToEvent = (routeName: string | symbol | undefined, matc
  * @param {any} info  需要下载的信息
  */
 export const downLoadData = (fileName: string, info: any) => {
-  let result = {
+  const result = {
     ...info
   }
-  let blob = new Blob([JSON.stringify(result)], { type: 'application/json' })
-  let url = URL.createObjectURL(blob)
-  let a = document.createElement('a')
+  const blob = new Blob([JSON.stringify(result)], { type: 'application/json' })
+  const url = URL.createObjectURL(blob)
+  const a = document.createElement('a')
   a.href = url
   a.download = fileName
   a.click()

+ 5 - 1
src/views/AppManage/BaseInfoView.vue

@@ -111,7 +111,11 @@ onMounted(() => {
     <HeaderCard :title="'基本信息'" :need-pf-select="false"></HeaderCard>
     <div class="body">
       <div class="info">
-        <div class="infoItem" v-for="[key, val] in Object.entries(fieldsInfo)">
+        <div
+          class="infoItem"
+          v-for="[key, val] in Object.entries(fieldsInfo)"
+          :key="`${key}${val}`"
+        >
           <span class="itemTitle">{{ val }}</span>
           <span class="text" :ref="key">{{ appInfo[key as keyof AppInfo] }}</span>
           <span class="copy" v-if="key === 'gid'" @click="copyGid">复制</span>

+ 4 - 4
src/views/AppManage/EventDetailsView.vue

@@ -13,9 +13,9 @@ import { useRoute } from 'vue-router'
 import { useRequest } from '@/hooks/useRequest'
 import { useCommonStore } from '@/stores/useCommon'
 
-import Form from '@/components/form/Form.vue'
-import Table from '@/components/table/Table.vue'
-import Dialog from '@/components/common/Dialog.vue'
+import Form from '@/components/form/CustomForm.vue'
+import Table from '@/components/table/CustomTable.vue'
+import Dialog from '@/components/common/CustomDialog.vue'
 import FileUpload from '@/components/form/FileUpload.vue'
 
 import axiosInstance from '@/utils/axios/axiosInstance'
@@ -24,7 +24,7 @@ import router from '@/router'
 const { selectInfo } = useCommonStore()
 const { AllApi, analysisResCode } = useRequest()
 
-const emits = defineEmits(['tableDataLoaded', 'upload'])
+defineEmits(['tableDataLoaded', 'upload'])
 
 // 事件表单对象
 const eventFormRef = ref()

+ 4 - 4
src/views/AppManage/EventManageView.vue

@@ -320,14 +320,14 @@ const createUploadReqFunc = async (url: string, reqParams: any, name: string): P
  * @param {*} allEventTable 获取的事件列表
  * @return {Promise<boolean>} 返回是否上传成功
  */
-const uploadEvent = async (
+const uploadEvents = async (
   uploadEventTable: Array<uploadEvent>,
   allEventTable: Array<DownLoadEvent>
 ): Promise<boolean> => {
   let eventReqUrl = AllApi.setGameAction
   let eventReqList: Array<Promise<boolean>> = []
   uploadEventTable.map((item: uploadEvent) => {
-    let { id, ...otherInfo } = item
+    let { id: _id, ...otherInfo } = item
     if (allEventTable.some((i: DownLoadEvent) => i.actionId === item.actionId)) {
       eventReqUrl = AllApi.updateGameAction
     }
@@ -357,7 +357,7 @@ const uploadOption = async (uploadOptionsInfo: { [key: string]: Array<UploadOpti
         // 对找到的那一组数据进行循环,区分出来哪些是已有的,哪些是新上传的
         // 新上传的需要给他加上actionId,然后上传,这个actionId其实是事件列表的id字段
         uploadOptionItem.map((i) => {
-          const { id, actionId: originalActionId, ...otherInfo } = i // 上传参数拆分出来
+          const { id, actionId: _originalActionId, ...otherInfo } = i // 上传参数拆分出来
           const isUpdate = nowOptionItem.some((k) => k.id === id) // 判断是否是更新选项
 
           // 设置请求 URL 和参数
@@ -423,7 +423,7 @@ const uploadSuccess = async (data: {
   if (Array.isArray(uploadEventTable) && uploadEventTable.length > 0) {
     // 将新事件和旧事件区分,对于新事件走新增,对于旧事件走更新
 
-    eventUploadResult = await uploadEvent(uploadEventTable, allEventTable)
+    eventUploadResult = await uploadEvents(uploadEventTable, allEventTable)
     // 如果事件上传全部失败,那么就不要再上传选项了
     if (eventUploadResult) {
       await uploadOption(uploadOptionsInfo)

+ 2 - 2
src/views/AppManage/EventMangeTable.vue

@@ -12,8 +12,8 @@ import { FieldSpecialEffectType, TextType } from '@/types/tableText'
 import { FormFieldType } from '@/types/form'
 import { reactive, ref, watch } from 'vue'
 
-import Table from '@/components/table/Table.vue'
-import Dialog from '@/components/common/Dialog.vue'
+import Table from '@/components/table/CustomTable.vue'
+import Dialog from '@/components/common/CustomDialog.vue'
 import router from '@/router'
 
 const { selectInfo } = useCommonStore()

+ 3 - 2
src/views/AppManage/UserConversionDetail.vue

@@ -3,7 +3,7 @@ import { FormFieldType } from '@/types/form'
 import type { FormField, ValueTypes } from '@/types/form'
 
 import { useRequest } from '@/hooks/useRequest'
-import { onMounted, reactive, ref } from 'vue'
+import { reactive, ref } from 'vue'
 import { useCommonStore } from '@/stores/useCommon'
 import type { FormInstance, FormRules } from 'element-plus'
 import axiosInstance from '@/utils/axios/axiosInstance'
@@ -239,7 +239,8 @@ const subForm = (formEl: FormInstance | undefined) => {
           formData.value
         )) as ResponseInfo
         if (result.code !== 0) {
-          throw new Error(result.msg)
+          console.log(result.msg)
+          return
         }
         ElMessage.success('设置成功')
       } catch (err) {

+ 1 - 1
src/views/AppManage/UserConversionTable.vue

@@ -2,7 +2,7 @@
 import { useRequest } from '@/hooks/useRequest'
 import { useCommonStore } from '@/stores/useCommon'
 
-import Table from '@/components/table/Table.vue'
+import Table from '@/components/table/CustomTable.vue'
 import type { ReqConfig } from '@/types/dataAnalysis'
 import { reactive, watch } from 'vue'
 import {

+ 4 - 4
src/views/Home/Analysis/AdvertisingUsers.vue

@@ -11,10 +11,10 @@ import { useCommonStore } from '@/stores/useCommon'
 import { formatTimestamp } from '@/utils/common'
 import { usePage } from '@/hooks/usePage'
 
-import Table from '@/components/table/Table.vue'
+import Table from '@/components/table/CustomTable.vue'
 import { FieldSpecialEffectType } from '@/types/tableText'
 
-type Table = typeof Table
+type TableType = InstanceType<typeof Table>
 
 const { AllApi } = useRequest()
 const { selectInfo } = useCommonStore()
@@ -23,7 +23,7 @@ const { watchPageChange } = usePage()
 
 const isSinglePf = ref(true)
 
-const advertisingUsersTable = ref<Table>()
+const advertisingUsersTable = ref<TableType>()
 
 // 表格请求配置
 const requestConfig = reactive<ReqConfig>({
@@ -229,7 +229,7 @@ const headerCardInfo: HeaderCardProps = {
  * @param {*} gid 新gid
  */
 const updateAllReq = (pf: string, gid: string) => {
-  pf = isSinglePf ? pf[0] : pf
+  pf = isSinglePf.value ? pf[0] : pf
   updateReqConfig(requestConfig, { pf, gid })
 }
 

+ 1 - 1
src/views/Home/Analysis/EventAnalysisDetail.vue

@@ -24,7 +24,7 @@ import { useRoute } from 'vue-router'
 import { useAnalysis } from '@/hooks/useAnalysis'
 import { useCommonStore } from '@/stores/useCommon'
 
-import Table from '@/components/table/Table.vue'
+import Table from '@/components/table/CustomTable.vue'
 import TemporalTrend from '@/components/dataAnalysis/TemporalTrend.vue'
 import router from '@/router'
 

+ 1 - 1
src/views/Home/Analysis/EventAnalysisTable.vue

@@ -10,7 +10,7 @@ import { resetTimeToMidnight } from '@/utils/common'
 import { useAnalysis } from '@/hooks/useAnalysis'
 import { usePage } from '@/hooks/usePage'
 
-import Table from '@/components/table/Table.vue'
+import Table from '@/components/table/CustomTable.vue'
 import router from '@/router'
 
 const { updateReqConfig } = useAnalysis()

+ 1 - 1
src/views/Home/Analysis/KeepView.vue

@@ -17,7 +17,7 @@ import { useCommonStore } from '@/stores/useCommon'
 import { useAnalysis } from '@/hooks/useAnalysis'
 import { usePage } from '@/hooks/usePage'
 
-import Table from '@/components/table/Table.vue'
+import Table from '@/components/table/CustomTable.vue'
 import HeaderCard from '@/components/dataAnalysis/HeaderCard.vue'
 import axiosInstance from '@/utils/axios/axiosInstance'
 

+ 4 - 4
src/views/Home/Analysis/UserBehavior.vue

@@ -12,10 +12,10 @@ import { formatTimestamp } from '@/utils/common'
 import { formatDate } from '@/utils/common'
 import { usePage } from '@/hooks/usePage'
 
-import Table from '@/components/table/Table.vue'
+import Table from '@/components/table/CustomTable.vue'
 import { FieldSpecialEffectType, TagType, TextType } from '@/types/tableText'
 
-type Table = typeof Table
+type TableType = InstanceType<typeof Table>
 
 const { AllApi } = useRequest()
 const { selectInfo } = useCommonStore()
@@ -24,7 +24,7 @@ const { watchPageChange } = usePage()
 
 const isSinglePf = ref(true)
 
-const behaviourTable = ref<Table>()
+const behaviourTable = ref<TableType>()
 
 // 表格请求配置
 const requestConfig = reactive<ReqConfig>({
@@ -266,7 +266,7 @@ const headerCardInfo: HeaderCardProps = {
  * @param {*} gid 新gid
  */
 const updateAllReq = (pf: string, gid: string) => {
-  pf = isSinglePf ? pf[0] : pf
+  pf = isSinglePf.value ? pf[0] : pf
   updateReqConfig(requestConfig, { pf, gid })
 }
 

+ 1 - 1
src/views/Home/Analysis/UserTrendView.vue

@@ -10,7 +10,7 @@ import { resetTimeToMidnight } from '@/utils/common'
 import { usePage } from '@/hooks/usePage'
 
 import HeaderCard from '@/components/dataAnalysis/HeaderCard.vue'
-import Table from '@/components/table/Table.vue'
+import Table from '@/components/table/CustomTable.vue'
 import StatisticText from '@/components/dataAnalysis/StatisticText.vue'
 import TemporalTrend from '@/components/dataAnalysis/TemporalTrend.vue'
 import axiosInstance from '@/utils/axios/axiosInstance'

+ 2 - 2
src/views/Home/InfoManage/GameManageView.vue

@@ -10,8 +10,8 @@ import { onMounted, reactive, ref, watch } from 'vue'
 import { useRequest } from '@/hooks/useRequest'
 import { useCommonStore } from '@/stores/useCommon'
 
-import Dialog from '@/components/common/Dialog.vue'
-import Table from '@/components/table/Table.vue'
+import Dialog from '@/components/common/CustomDialog.vue'
+import Table from '@/components/table/CustomTable.vue'
 import { FieldSpecialEffectType } from '@/types/tableText.ts'
 
 const { allGameInfo, selectInfo } = useCommonStore()

+ 2 - 2
src/views/Home/InfoManage/PlayerManageView.vue

@@ -13,8 +13,8 @@ import { useRequest } from '@/hooks/useRequest'
 import { useCommonStore } from '@/stores/useCommon'
 import { useAnalysis } from '@/hooks/useAnalysis'
 
-import Dialog from '@/components/common/Dialog.vue'
-import Table from '@/components/table/Table.vue'
+import Dialog from '@/components/common/CustomDialog.vue'
+import Table from '@/components/table/CustomTable.vue'
 import axiosInstance from '@/utils/axios/axiosInstance'
 
 const { updateReqConfig } = useAnalysis()

+ 12 - 7
src/views/Index.vue → src/views/IndexView.vue

@@ -2,7 +2,7 @@
  * @Author: fxs bjnsfxs@163.com
  * @Date: 2024-08-20 14:06:49
  * @LastEditors: fxs bjnsfxs@163.com
- * @LastEditTime: 2024-11-27
+ * @LastEditTime: 2024-11-28
  * @Description: 
  * 
 -->
@@ -37,8 +37,8 @@ const loadingState = ref(false) // 用来标记必要信息的加载状态
 const menuList = reactive<Array<any>>([])
 
 // 默认选中
-const defaultActive = computed(() => {
-  return route.meta.activeMenu
+const defaultActive = computed<string>(() => {
+  return route.meta.activeMenu as string
 })
 
 // 顶部导航栏信息
@@ -111,7 +111,7 @@ const changeNavBar = (val: string) => {
 
 // 资源的加载路径
 const resourceInfo: Record<string, string> = {
-  logo: `/img/logoTest.svg`,
+  logo: `/img/logo.svg`,
   defaultHead: `/img/default/defaultHead.png`
 }
 
@@ -243,7 +243,7 @@ onMounted(() => {
       <div class="navBarBox">
         <div class="logoBox">
           <el-image :fit="'fill'" class="logoImg" :src="blobUrlInfo.logo"></el-image>
-          <span class="logoTitle">测试库</span>
+          <span class="logoTitle">淳皓游戏管理平台</span>
         </div>
 
         <div class="gameSelect">
@@ -269,6 +269,7 @@ onMounted(() => {
           >
             <el-menu-item
               v-for="item in navBarMenuList"
+              :key="item.name"
               class="navBarMenuItem"
               :index="item.name"
               >{{ item.title }}</el-menu-item
@@ -294,7 +295,11 @@ onMounted(() => {
         <el-menu :default-active="defaultActive" class="sideBar" :collapse="isCollapse">
           <!--          ref="sideBar"-->
           <template v-for="(item, index) in menuList">
-            <el-sub-menu :index="`${index}`" v-if="item.children && item.showChild">
+            <el-sub-menu
+              :index="`${index}`"
+              v-if="item.children && item.showChild"
+              :key="item.name"
+            >
               <template #title>
                 <el-icon><component :is="item.icon"></component></el-icon>
                 <span>{{ item.cnName }}</span>
@@ -303,7 +308,7 @@ onMounted(() => {
                 style="text-decoration: none"
                 v-for="val in item.children"
                 :to="{ path: basePath + '/' + item.path + '/' + val.path }"
-                :key="index"
+                :key="val"
               >
                 <el-menu-item :index="val.path">{{ val.cnName }}</el-menu-item>
               </router-link>