3 コミット 196fbc3eef ... 2093841bc7

作者 SHA1 メッセージ 日付
  furffico 2093841bc7 Merge branch 'dev-furffico' 1 年間 前
  web bbe477ff52 feat(liveroomList): 商品跳转记录 1 年間 前
  web 5c98332e4e feat(liveroomList): 商品跳转记录 1 年間 前

+ 1 - 0
package.json

@@ -31,6 +31,7 @@
     "@types/crypto-js": "^4.1.1",
     "@types/jest": "^24.0.19",
     "@types/lodash": "^4.14.195",
+    "@types/node": "^20.4.5",
     "@types/uuid": "^9.0.2",
     "@vue/cli-plugin-babel": "~4.5.15",
     "@vue/cli-plugin-typescript": "~4.5.15",

+ 20 - 13
pnpm-lock.yaml

@@ -1,5 +1,9 @@
 lockfileVersion: '6.0'
 
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
 dependencies:
   '@smallwei/avue':
     specifier: 2.8.27
@@ -63,6 +67,9 @@ devDependencies:
   '@types/lodash':
     specifier: ^4.14.195
     version: registry.npmmirror.com/@types/lodash@4.14.195
+  '@types/node':
+    specifier: ^20.4.5
+    version: registry.npmmirror.com/@types/node@20.4.5
   '@types/uuid':
     specifier: ^9.0.2
     version: registry.npmmirror.com/@types/uuid@9.0.2
@@ -2142,7 +2149,7 @@ packages:
     version: 1.19.2
     dependencies:
       '@types/connect': registry.npmmirror.com/@types/connect@3.4.35
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
     dev: true
 
   registry.npmmirror.com/@types/connect-history-api-fallback@1.5.0:
@@ -2151,7 +2158,7 @@ packages:
     version: 1.5.0
     dependencies:
       '@types/express-serve-static-core': registry.npmmirror.com/@types/express-serve-static-core@4.17.35
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
     dev: true
 
   registry.npmmirror.com/@types/connect@3.4.35:
@@ -2159,7 +2166,7 @@ packages:
     name: '@types/connect'
     version: 3.4.35
     dependencies:
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
     dev: true
 
   registry.npmmirror.com/@types/crypto-js@4.1.1:
@@ -2173,7 +2180,7 @@ packages:
     name: '@types/express-serve-static-core'
     version: 4.17.35
     dependencies:
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
       '@types/qs': registry.npmmirror.com/@types/qs@6.9.7
       '@types/range-parser': registry.npmmirror.com/@types/range-parser@1.2.4
       '@types/send': registry.npmmirror.com/@types/send@0.17.1
@@ -2196,7 +2203,7 @@ packages:
     version: 7.2.0
     dependencies:
       '@types/minimatch': registry.npmmirror.com/@types/minimatch@5.1.2
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
     dev: true
 
   registry.npmmirror.com/@types/http-errors@2.0.1:
@@ -2210,7 +2217,7 @@ packages:
     name: '@types/http-proxy'
     version: 1.17.11
     dependencies:
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
     dev: true
 
   registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.4:
@@ -2286,10 +2293,10 @@ packages:
     version: 1.2.2
     dev: true
 
-  registry.npmmirror.com/@types/node@20.4.2:
-    resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-20.4.2.tgz}
+  registry.npmmirror.com/@types/node@20.4.5:
+    resolution: {integrity: sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-20.4.5.tgz}
     name: '@types/node'
-    version: 20.4.2
+    version: 20.4.5
     dev: true
 
   registry.npmmirror.com/@types/normalize-package-data@2.4.1:
@@ -2329,7 +2336,7 @@ packages:
     version: 0.17.1
     dependencies:
       '@types/mime': registry.npmmirror.com/@types/mime@1.3.2
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
     dev: true
 
   registry.npmmirror.com/@types/serve-static@1.15.2:
@@ -2339,7 +2346,7 @@ packages:
     dependencies:
       '@types/http-errors': registry.npmmirror.com/@types/http-errors@2.0.1
       '@types/mime': registry.npmmirror.com/@types/mime@3.0.1
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
     dev: true
 
   registry.npmmirror.com/@types/source-list-map@0.1.2:
@@ -2412,7 +2419,7 @@ packages:
     name: '@types/webpack-sources'
     version: 3.2.0
     dependencies:
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
       '@types/source-list-map': registry.npmmirror.com/@types/source-list-map@0.1.2
       source-map: registry.npmmirror.com/source-map@0.7.4
     dev: true
@@ -2422,7 +2429,7 @@ packages:
     name: '@types/webpack'
     version: 4.41.33
     dependencies:
-      '@types/node': registry.npmmirror.com/@types/node@20.4.2
+      '@types/node': registry.npmmirror.com/@types/node@20.4.5
       '@types/tapable': registry.npmmirror.com/@types/tapable@1.0.8
       '@types/uglify-js': registry.npmmirror.com/@types/uglify-js@3.17.1
       '@types/webpack-sources': registry.npmmirror.com/@types/webpack-sources@3.2.0

+ 198 - 0
src/components/base-table/base-table.vue

@@ -0,0 +1,198 @@
+<template>
+  <div class="table-wrap" v-loading='loading'>
+    <div class="table-page-search-wrapper" v-if="condition.length">
+      <el-form :inline="true" class="demo-form-inline" label-width='80px' size="small">
+        <el-row :gutter='10'>
+          <el-col :span='span' v-for='v in condition' :key='v.dataIndex'>
+            <el-form-item :label="layout === 'include' ? '' : v.title" style="display: flex">
+              <el-input v-model='queryParam[v.dataIndex]' :placeholder="layout === 'include' ? v.title : '请输入'"
+                v-if="v.type === 'input'" clearable />
+              <el-date-picker v-model='queryParam[v.dataIndex]' valueFormat="YYYY-MM-DD"
+                v-else-if="v.type === 'time-range'" :placeholder="layout === 'include' ? v.title : '请选择'" />
+              <el-select v-model='queryParam[v.dataIndex]' :placeholder="layout === 'include' ? v.title : '请选择'"
+                :default-value='v.defaultValue' v-else-if="v.type === 'select'" clearable>
+                <el-option :value='v1.value' :label="v1.label" v-for='v1 in v.options' :key='v1.value'></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span='24 - condition.length % (24 / span) * span'>
+            <span class="table-page-search-submitButtons">
+              <el-button type="primary" @click='onQueryClick' size="small">
+                查询
+              </el-button>
+              <el-button style="margin-left: 8px" @click='reset' size="small">
+                重置
+              </el-button>
+              <slot name='append-btn'></slot>
+            </span>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+    <el-table :data='tableData' style="margin: 6px 0;" v-bind="$attrs" v-on='$listeners' ref='table'>
+      <el-table-column type="selection" width="55" v-if="isSelection">
+      </el-table-column>
+      <el-table-column v-bind='v' :prop='v.dataIndex' :label='v.title' v-for="(v, i) in columns" :key='i'>
+        <template slot-scope="scope">
+          <!-- 格式化函数 -->
+          <span
+            v-if="v.scopedSlots && v.scopedSlots.customRender && Object.prototype.toString.call(v.scopedSlots.customRender) === '[object Function]'">
+            {{ v.scopedSlots.customRender(scope.row[v.dataIndex], scope.row, scope.$index) }}
+          </span>
+          <!-- 格式化插槽 -->
+          <slot v-else-if="v.scopedSlots && v.scopedSlots.customRender" v-bind='scope' :name="v.scopedSlots.customRender">
+          </slot>
+          <span v-else>{{ scope.row[v.dataIndex] }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination :layout="paginationSize === 'mini' ? 'prev, pager, next' : 'total, sizes, prev, pager, next, jumper'"
+      :currentPage.sync='localPagination.currentPage' :pageCount.sync='localPagination.totalPage'
+      :style="paginationSize === 'mini' ? 'display: flex;justify-content: center;' : 'display: flex;justify-content: flex-end;'"
+      :page-sizes="[5, 10, 20, 30, 50]" @size-change="queryTable" @current-change="queryTable" v-if='showPagination'>
+    </el-pagination>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'BaseTable',
+  props: {
+    columns: {
+      default: () => [],
+      required: true,
+    },
+    condition: {
+      default: () => [],
+      required: false
+    },
+    queryFunction: {
+      required: false
+    },
+    pagination: {
+      required: false,
+      default: () => ({
+        pageSize: 10,
+      }),
+    },
+    paginationText: {
+      required: false,
+      default: () => ({
+        currentPage: 'currentPage', total: 'total', totalPage: 'totalPage', data: 'data'
+      }),
+    },
+    span: {
+      required: false,
+      default: 6
+    },
+    paginationSize: {
+      required: false,
+      default: 'small'
+    },
+    layout: {
+      required: false,
+      default: 'normal'
+    },
+    // 无需查询的静态数据
+    injectData: {
+      required: false,
+      default: null
+    },
+    isSelection: {
+      required: false,
+      default: false
+    },
+    rowKey: {
+      required: false,
+      default: 'id'
+    },
+  },
+  data() {
+    return {
+      tableData: [],
+      queryParam: {}, // 暂存
+      confirmParam: {}, // 点击查询键后赋值
+
+      localPagination: Object.assign({
+        currentPage: 1,
+        total: 10
+      }, this.pagination),
+      loading: false,
+
+      selectedRows: [],
+      selectedRowKeys: [],
+
+      showPagination: true
+    };
+  },
+  async created() {
+    this.condition.forEach(v => {
+      v.defaultValue && this.$set(this.queryParam, v.dataIndex, v.defaultValue)
+    })
+    if (this.injectData) {
+      this.tableData = this.injectData
+      this.showPagination = false
+    } else {
+      this.queryTable()
+    }
+  },
+  watch: {
+    injectData: {
+      handler(v) {
+        this.tableData = v
+      },
+      deep: true
+    }
+  },
+  methods: {
+    async submit() {
+    },
+    onQueryClick() {
+      this.confirmParam = JSON.parse(JSON.stringify(this.queryParam))
+      this.localPagination.currentPage = 1
+      this.queryTable()
+    },
+    async queryTable() {
+      this.loading = true
+      try {
+        const { confirmParam, paginationText, localPagination } = this
+        const queryParamFilter = {}
+        Object.keys(confirmParam).forEach(key => confirmParam[key] && (queryParamFilter[key] = confirmParam[key]))
+        const queryResult = await this.queryFunction(
+          {
+            [paginationText.currentPage]: localPagination.currentPage,
+            query: queryParamFilter
+          }
+        )
+        this.tableData = queryResult[paginationText.data]
+        this.localPagination = {
+          currentPage: queryResult[paginationText.currentPage],
+          total: queryResult[paginationText.total],
+          totalPage: queryResult[paginationText.totalPage]
+        }
+      } finally {
+        this.loading = false
+      }
+    },
+    reset() {
+      this.queryParam = {}
+      this.confirmParam = {}
+      this.queryTable()
+    },
+    /**
+     * 表格重新加载方法
+     * 如果参数为 true, 则强制刷新到第一页
+     * @param Boolean bool
+     */
+    refresh(bool = false) {
+      bool && (this.localPagination.currentPage = 1)
+      this.queryTable()
+    },
+    test(v) {
+      console.log(v)
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 5 - 0
src/router/index.ts

@@ -71,6 +71,11 @@ export const pages = [
     component: _import("modules/liveroom/liveroomEdit"),
     name: "liveroomEdit",
     meta: { title: "直播间信息", sidebar: false, icon: "", isTab: false }
+  }, {
+    path: "/liveroom/liveroom-product-jump-record/:id",
+    component: _import("modules/liveroom/liveroomProductJumpRecord"),
+    name: "liveroomProductJumpRecord",
+    meta: { title: "商品跳转记录", sidebar: false, icon: "", isTab: false }
   }, {
     path: "/liveroom/product/:id",
     component: _import("modules/liveroom/liveroomProd"),

+ 2 - 1
src/utils/debounce.ts

@@ -10,11 +10,12 @@ export const Debounce = (fn: Function, t: number) => {
 
     let callNow = !timer
 
+    //@ts-ignore
     timer = setTimeout(() => {
       timer = null
     }, delay)
 
     // @ts-ignore
-    if(callNow) fn.apply(this, args)
+    if (callNow) fn.apply(this, args)
   }
 }

+ 1 - 1
src/views/modules/liveroom/liveroomList-opbar.vue

@@ -16,7 +16,7 @@
         <el-button type="primary" size="small" disabled><icon-svg name="question" /></el-button>
       </el-tooltip>
       <el-tooltip effect="dark" content="商品跳转记录" placement="top" :enterable="false">
-        <el-button type="info" size="small" disabled><icon-svg name="record" /></el-button>
+        <el-button type="info" size="small" @click="$router.push(`/liveroom/liveroom-product-jump-record/${id}`)"><icon-svg name="record" /></el-button>
       </el-tooltip>
       <el-tooltip effect="dark" content="邀约码统计" placement="top" :enterable="false">
         <el-button type="info" size="small" disabled><icon-svg name="share" /></el-button>

+ 44 - 0
src/views/modules/liveroom/liveroomProductJumpRecord.vue

@@ -0,0 +1,44 @@
+<template>
+  <div>sss</div>
+</template>
+
+<script>
+import BaseTable from "@/components/base-table/base-table.vue"
+export default {
+    data() {
+    return {
+      columns: [],
+      condition: [],
+      queryParam: {},
+      queryFunction: params => new Promise((resolve, reject) => {
+        const formatParams = {
+          page: params.pageCurrent, ...params.query
+        }
+        return this.$http({
+          url: '/order/index',
+          method: 'post',
+          data: formatParams,
+          params: formatParams
+        }).then(
+          ({ data }) => {
+            resolve(data)
+          }
+        ).catch(e => reject(e))
+      }),
+    }
+  },
+  components: { BaseTable,  },
+  mounted() {
+    console.log(this.$route.params.id);
+  },
+  methods: {
+    show(scope) {
+      this.$refs.dialog.show(scope.row)
+    },
+  }
+}
+</script>
+
+<style>
+
+</style>

+ 2 - 1
tsconfig.json

@@ -16,7 +16,8 @@
     "baseUrl": ".",
     "types": [
       "webpack-env",
-      "jest"
+      "jest",
+      "node"
     ],
     "paths": {
       "@/*": [

+ 1 - 1
vue.config.js

@@ -47,7 +47,7 @@ module.exports = {
     devServer: {
       proxy: {
         // "^/user": {target: "http://192.168.58.137:10086"},
-        "^/(user|goods|goodsTypes|order|orderItem|rooms)/": { target: "http://127.0.0.1:10086" },
+        "^/(user|goods|goodsTypes|order|orderItem|rooms)/": { target: "http://192.168.43.46:10086" },
         "^/.*": { target: "http://116.63.32.160:8085" },
       },
     }