Ver Código Fonte

feat: 数据看板 - 花生数据循环统计 - 权限控制逻辑

zhengxy 2 anos atrás
pai
commit
28e268534d
1 arquivos alterados com 103 adições e 71 exclusões
  1. 103 71
      project/src/components/dataBoard/regRangeReportHS.vue

+ 103 - 71
project/src/components/dataBoard/regRangeReportHS.vue

@@ -1,74 +1,80 @@
1 1
 <template>
2
-  <div v-loading="loading">
3
-    <div class="screenBox filter-wrap">
4
-      <date-picker :reset="reset" title="自定义" :quickFlag='true' :afferent_time="default_time" :clearFlag='false' @changeTime="changeTime"></date-picker>
5
-      <!-- 推广类型 -->
6
-      <selfChannel :reset="reset" title="推广类型" type="promotionType" @channelDefine="onChangePlatOrderType" style="margin-left: -30px; margin-right: 0;" />
7
-      <!-- 收益截止日期 -->
8
-      <div class="common-screen-item">
9
-        <label class="common-screen-label">收益截止日期</label>
10
-        <el-date-picker v-model="closing_date" value-format="yyyy-MM-dd" type="date" placeholder="选择日期" size="small" style="width:150px" @change="onChangeClosingDate" />
11
-      </div>
12
-      <!-- 花生mp账号 -->
13
-      <selfChannel :reset="reset" title="账号" type="mpAccountHS" @channelDefine="onChangeAccountHS" style="margin-left: -60px;" />
14
-      <input-range v-model="firstDayRoi" label="首日ROI" />
15
-      <input-range v-model="firstOrderCost " label="下单成本" />
16
-      <input-range v-model="perFollowCost" label="企微成本" />
17
-      <input-range v-model="totalRoi" label="回本率" />
18
-      <input-range v-model="paid" label="消耗" />
19
-      <div>
20
-        <el-button size="mini" type="primary" plain @click="init(1);handleGetUpdateTime();">确定</el-button>
21
-        <el-button size="mini" plain @click="handleReset">重置</el-button>
22
-        <el-button type="primary" size="mini" @click="init(1, 'export')">导出Excel</el-button>
2
+  <div class="regRangeReportHS-wrap" v-loading="loading">
3
+    <!-- S 无权限 -->
4
+    <el-empty class="empty-wrap" v-if="isShowEmpty" description="暂无数据权限" />
5
+    <!-- E 无权限 -->
6
+
7
+    <template v-else>
8
+      <div class="screenBox filter-wrap">
9
+        <date-picker :reset="reset" title="自定义" :quickFlag='true' :afferent_time="default_time" :clearFlag='false' @changeTime="changeTime"></date-picker>
10
+        <!-- 推广类型 -->
11
+        <selfChannel :reset="reset" title="推广类型" type="promotionType" @channelDefine="onChangePlatOrderType" style="margin-left: -30px; margin-right: 0;" />
12
+        <!-- 收益截止日期 -->
13
+        <div class="common-screen-item">
14
+          <label class="common-screen-label">收益截止日期</label>
15
+          <el-date-picker v-model="closing_date" value-format="yyyy-MM-dd" type="date" placeholder="选择日期" size="small" style="width:150px" @change="onChangeClosingDate" />
16
+        </div>
17
+        <!-- 花生mp账号 -->
18
+        <selfChannel :reset="reset" title="账号" type="mpAccountHS" @channelDefine="onChangeAccountHS" style="margin-left: -60px;" />
19
+        <input-range v-model="firstDayRoi" label="首日ROI" />
20
+        <input-range v-model="firstOrderCost " label="下单成本" />
21
+        <input-range v-model="perFollowCost" label="企微成本" />
22
+        <input-range v-model="totalRoi" label="回本率" />
23
+        <input-range v-model="paid" label="消耗" />
24
+        <div>
25
+          <el-button size="mini" type="primary" plain @click="init(1);handleGetUpdateTime();">确定</el-button>
26
+          <el-button size="mini" plain @click="handleReset">重置</el-button>
27
+          <el-button v-if="isCanExport" type="primary" size="mini" @click="init(1, 'export')">导出Excel</el-button>
28
+        </div>
23 29
       </div>
24
-    </div>
25
-    <!-- S 数据更新时间 -->
26
-    <div class="update-time"><i class="el-icon-warning-outline" />数据更新时间:{{ updateTime || '-' }}</div>
27
-    <!-- E 数据更新时间 -->
28
-    <!-- S 汇总表 summaryTable -->
29
-    <ux-grid style="margin-top:10px" ref="summaryTable" :border="false" @row-click="() => { return }" :header-cell-style="() => { return { backgroundColor: '#FFFFFF !important', border: 'none!important' } }" show-footer-overflow="tooltip" show-overflow="tooltip" size="mini">
30
-      <ux-table-column v-for="item in summaryTableCol" :key="item.column + item.name" :resizable="true" :field="item.column" :title="item.name" :min-width="item.min_width ? item.min_width : 140" :fixed="item.fixed ? item.fixed : ''" align="center">
31
-        <template #header>
32
-          <div class="flex-align-jus-center">
33
-            {{ item.name }}
34
-            <el-tooltip v-if="item.notes" :content="item.notes" placement="top">
35
-              <div><i class="el-icon-question"></i></div>
36
-            </el-tooltip>
37
-          </div>
38
-        </template>
39
-        <template v-slot="{ row }">
40
-          <span>{{ (row[item.column] || row[item.column] == 0) ? $formatNum(row[item.column]) : '-' }}</span>
41
-        </template>
42
-      </ux-table-column>
43
-    </ux-grid>
44
-    <!-- E 汇总表 summaryTable -->
30
+      <!-- S 数据更新时间 -->
31
+      <div class="update-time"><i class="el-icon-warning-outline" />数据更新时间:{{ updateTime || '-' }}</div>
32
+      <!-- E 数据更新时间 -->
33
+      <!-- S 汇总表 summaryTable -->
34
+      <ux-grid style="margin-top:10px" ref="summaryTable" :border="false" @row-click="() => { return }" :header-cell-style="() => { return { backgroundColor: '#FFFFFF !important', border: 'none!important' } }" show-footer-overflow="tooltip" show-overflow="tooltip" size="mini">
35
+        <ux-table-column v-for="item in summaryTableCol" :key="item.column + item.name" :resizable="true" :field="item.column" :title="item.name" :min-width="item.min_width ? item.min_width : 140" :fixed="item.fixed ? item.fixed : ''" align="center">
36
+          <template #header>
37
+            <div class="flex-align-jus-center">
38
+              {{ item.name }}
39
+              <el-tooltip v-if="item.notes" :content="item.notes" placement="top">
40
+                <div><i class="el-icon-question"></i></div>
41
+              </el-tooltip>
42
+            </div>
43
+          </template>
44
+          <template v-slot="{ row }">
45
+            <span>{{ (row[item.column] || row[item.column] == 0) ? $formatNum(row[item.column]) : '-' }}</span>
46
+          </template>
47
+        </ux-table-column>
48
+      </ux-grid>
49
+      <!-- E 汇总表 summaryTable -->
45 50
 
46
-    <!-- S 明细表 detailsTable -->
47
-    <ux-grid style="margin-top:10px" ref="detailsTable" :border="false" @row-click="() => { return }" :header-cell-style="() => { return { backgroundColor: '#FFFFFF !important', border: 'none!important' } }" :height="height" show-footer-overflow="tooltip" show-overflow="tooltip" size="mini">
48
-      <ux-table-column v-for="item in detailsTableCol" :key="item.column + item.name" :resizable="true" :field="item.column" :title="item.name" :min-width="item.min_width ? item.min_width : 140" :fixed="item.fixed ? item.fixed : ''" align="center">
49
-        <template #header>
50
-          <div class="flex-align-jus-center">
51
-            {{ item.name }}
52
-            <el-tooltip v-if="item.notes" :content="item.notes" placement="top">
53
-              <div><i class="el-icon-question"></i></div>
54
-            </el-tooltip>
55
-            <div v-if="item.enable_to_sort" class="sort-wrap">
56
-              <i class="el-icon-caret-top" :class="{ 'active': sort_field === item.column && sort_type === 'asc' }" @click="onClickSort(item.column, 'asc')" />
57
-              <i class="el-icon-caret-bottom" :class="{ 'active': sort_field === item.column && sort_type === 'desc' }" @click="onClickSort(item.column, 'desc')" />
51
+      <!-- S 明细表 detailsTable -->
52
+      <ux-grid style="margin-top:10px" ref="detailsTable" :border="false" @row-click="() => { return }" :header-cell-style="() => { return { backgroundColor: '#FFFFFF !important', border: 'none!important' } }" :height="height" show-footer-overflow="tooltip" show-overflow="tooltip" size="mini">
53
+        <ux-table-column v-for="item in detailsTableCol" :key="item.column + item.name" :resizable="true" :field="item.column" :title="item.name" :min-width="item.min_width ? item.min_width : 140" :fixed="item.fixed ? item.fixed : ''" align="center">
54
+          <template #header>
55
+            <div class="flex-align-jus-center">
56
+              {{ item.name }}
57
+              <el-tooltip v-if="item.notes" :content="item.notes" placement="top">
58
+                <div><i class="el-icon-question"></i></div>
59
+              </el-tooltip>
60
+              <div v-if="item.enable_to_sort" class="sort-wrap">
61
+                <i class="el-icon-caret-top" :class="{ 'active': sort_field === item.column && sort_type === 'asc' }" @click="onClickSort(item.column, 'asc')" />
62
+                <i class="el-icon-caret-bottom" :class="{ 'active': sort_field === item.column && sort_type === 'desc' }" @click="onClickSort(item.column, 'desc')" />
63
+              </div>
58 64
             </div>
59
-          </div>
60
-        </template>
61
-        <template v-slot="{ row }">
62
-          <span>{{ (row[item.column] || row[item.column] == 0) ? $formatNum(row[item.column]) : '-' }}</span>
63
-        </template>
64
-      </ux-table-column>
65
-    </ux-grid>
66
-    <div class="pagination" v-show="total > 0">
67
-      <el-pagination background :current-page="page" @current-change="handleCurrentChange" layout="prev, pager, next"
68
-        :page-count='Number(pages)'>
69
-      </el-pagination>
70
-    </div>
71
-    <!-- E 明细表 detailsTable -->
65
+          </template>
66
+          <template v-slot="{ row }">
67
+            <span>{{ (row[item.column] || row[item.column] == 0) ? $formatNum(row[item.column]) : '-' }}</span>
68
+          </template>
69
+        </ux-table-column>
70
+      </ux-grid>
71
+      <div class="pagination" v-show="total > 0">
72
+        <el-pagination background :current-page="page" @current-change="handleCurrentChange" layout="prev, pager, next"
73
+          :page-count='Number(pages)'>
74
+        </el-pagination>
75
+      </div>
76
+      <!-- E 明细表 detailsTable -->
77
+    </template>
72 78
   </div>
73 79
 </template>
74 80
 <script>
@@ -106,13 +112,29 @@ export default {
106 112
       sort_field: 'date', // 排序字段 默认 时间 & 降序
107 113
       sort_type: 'desc', // 升序/降序
108 114
       updateTime: '', // 数据更新时间
115
+      isShowEmpty: false, // 是否展示空页面 => 无任何权限时展示
109 116
     }
110 117
   },
118
+  computed: {
119
+    // 是否有“MP”权限(花生数据循环统计表 只需要判断是否有MP权限)
120
+    isShowMpBtn() {
121
+      return !!this.$store.state.dataBoardAuth.mp_auth
122
+    },
123
+    // 是否有“导出”权限
124
+    isCanExport() {
125
+      return !!this.$store.state.dataBoardAuth.can_export
126
+    },
127
+  },
111 128
   created () {
112
-    this.height = document.documentElement.clientHeight - 200 > 400 ? document.documentElement.clientHeight - 200 : 400
113
-    this.time = this.default_time
114
-    this.init(1)
115
-    this.handleGetUpdateTime()
129
+    if (this.isShowMpBtn) { // 有权限 => 获取报表数据
130
+      this.height = document.documentElement.clientHeight - 200 > 400 ? document.documentElement.clientHeight - 200 : 400
131
+      this.time = this.default_time
132
+      this.init(1)
133
+      this.handleGetUpdateTime()
134
+    } else { // 无权限 => 展示空页面
135
+      this.isShowEmpty = true
136
+      this.$message.warning('暂无数据权限')
137
+    }
116 138
   },
117 139
   methods: {
118 140
     // 重置
@@ -301,6 +323,16 @@ export default {
301 323
 }
302 324
 </script>
303 325
 <style lang="scss" scoped>
326
+.regRangeReportHS-wrap {
327
+  position: relative;
328
+  min-height: calc(100vh - 70px);
329
+  .empty-wrap {
330
+    position: absolute;
331
+    top: 50%;
332
+    left: 50%;
333
+    transform: translate(-50%, -50%);
334
+  }
335
+}
304 336
 .screenBox {
305 337
   position: relative;
306 338
   background: #fff;