Browse Source

对接获取DeepChart活跃用户明细和获取地区列表接口完成;

zhaowenkang/feature-20260206140254-后台AI复盘二期
songjie 1 month ago
parent
commit
7547ae7626
  1. 45
      src/api/platformData.js
  2. 137
      src/views/PlatformData/UserActivityStats.vue

45
src/api/platformData.js

@ -246,3 +246,48 @@ export function getUserDeepChartTrend(params) {
data: formData data: formData
}) })
} }
// 获取DeepChart活跃用户明细
export function getDeepChartActiveUserList(params) {
const formData = new FormData();
formData.append('token', localStorage.getItem('token'));
if (params) {
if (params.page) formData.append('page', params.page);
if (params.page_size) formData.append('page_size', params.page_size);
if (params.jwcode) formData.append('jwcode', params.jwcode);
if (params.region && params.region !== 'all') formData.append('region', params.region);
if (params.startTime) formData.append('startTime', params.startTime);
if (params.endTime) formData.append('endTime', params.endTime);
if (params.isExport) formData.append('isExport', params.isExport);
}
return request({
url: 'https://16866f84.r7.cpolar.top/admin/user/active/list',
method: 'post',
headers: {
'token': localStorage.getItem('token'),
'client': 'ios',
'version': '1',
'Content-Type': 'multipart/form-data'
},
data: formData
})
}
// 获取地区列表
export function getRegionsList() {
const formData = new FormData();
formData.append('token', localStorage.getItem('token'));
return request({
url: 'https://16866f84.r7.cpolar.top/admin/regions/list',
method: 'post',
headers: {
'token': localStorage.getItem('token'),
'client': 'ios',
'version': '1',
'Content-Type': 'multipart/form-data'
},
data: formData
})
}

137
src/views/PlatformData/UserActivityStats.vue

@ -43,6 +43,12 @@
<el-input v-model="tableAccount" placeholder="请输入账号" style="width: 150px" /> <el-input v-model="tableAccount" placeholder="请输入账号" style="width: 150px" />
<el-select v-model="tableRegion" placeholder="请选择所属地区" style="width: 150px"> <el-select v-model="tableRegion" placeholder="请选择所属地区" style="width: 150px">
<el-option label="全部" value="all" /> <el-option label="全部" value="all" />
<el-option
v-for="item in regionOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
<el-date-picker <el-date-picker
@ -55,8 +61,8 @@
style="width: 240px" style="width: 240px"
/> />
<el-button type="primary" class="search-btn-small">搜索</el-button>
<el-button type="primary" class="reset-btn-small">重置</el-button>
<el-button type="primary" class="search-btn-small" @click="handleTableSearch">搜索</el-button>
<el-button type="primary" class="reset-btn-small" @click="handleTableReset">重置</el-button>
<el-button type="danger" class="export-btn-small">数据导出</el-button> <el-button type="danger" class="export-btn-small">数据导出</el-button>
<el-button type="danger" class="export-list-btn">查看导出列表</el-button> <el-button type="danger" class="export-list-btn">查看导出列表</el-button>
</div> </div>
@ -69,19 +75,23 @@
<el-table-column prop="loginCount" label="登录次数" width="100" align="center" /> <el-table-column prop="loginCount" label="登录次数" width="100" align="center" />
<el-table-column prop="totalDuration" label="总停留时长" min-width="150" align="center" /> <el-table-column prop="totalDuration" label="总停留时长" min-width="150" align="center" />
<el-table-column prop="avgDuration" label="平均停留时长" min-width="150" align="center" /> <el-table-column prop="avgDuration" label="平均停留时长" min-width="150" align="center" />
<el-table-column prop="deepMate" label="DeepMate" min-width="150" align="center" />
<el-table-column prop="deepExplore" label="深度探索" min-width="150" align="center" />
<el-table-column prop="deepMate" label="DeepMate" min-width="100" align="center" />
<el-table-column prop="deepExplore" label="深度探索" min-width="100" align="center" />
<el-table-column prop="marketInfo" label="行情" min-width="100" align="center" />
<el-table-column prop="updateTime" label="更新日期" min-width="150" align="center" />
</el-table> </el-table>
<div class="pagination-container"> <div class="pagination-container">
<div class="total-count">400</div>
<div class="total-count">{{ total }}</div>
<el-pagination <el-pagination
background background
layout="sizes, prev, pager, next, jumper" layout="sizes, prev, pager, next, jumper"
:total="400"
:total="total"
:page-sizes="[10, 20, 50, 100]" :page-sizes="[10, 20, 50, 100]"
v-model:current-page="currentPage" v-model:current-page="currentPage"
v-model:page-size="pageSize" v-model:page-size="pageSize"
@current-change="handlePageChange"
@size-change="handleSizeChange"
/> />
</div> </div>
</div> </div>
@ -92,7 +102,7 @@
import { ref, onMounted, nextTick, watch } from 'vue'; import { ref, onMounted, nextTick, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import * as echarts from 'echarts'; import * as echarts from 'echarts';
import { getUserDeepChartTrend } from '../../api/platformData';
import { getUserDeepChartTrend, getDeepChartActiveUserList, getRegionsList } from '../../api/platformData';
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
@ -256,21 +266,106 @@ const tableAccount = ref('');
const tableRegion = ref(''); const tableRegion = ref('');
const tableDateRange = ref(''); const tableDateRange = ref('');
const currentPage = ref(1); const currentPage = ref(1);
const pageSize = ref(50);
const pageSize = ref(10);
const total = ref(0);
const regionOptions = ref([]);
//
const fetchRegionOptions = async () => {
try {
const res = await getRegionsList();
console.log("获取地区列表响应:", res);
const data = res.data || res;
if (data && data.list) {
regionOptions.value = data.list.map(region => ({ label: region, value: region }));
}
} catch (e) {
console.error('获取地区列表失败:', e);
}
};
// //
const tableData = ref([
{ index: 1, account: 'DC900480004', name: 'Thea Elowen Hale', region: '中国', loginCount: 99, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
{ index: 2, account: 'DC900480004', name: '欧帝三萃', region: '美国', loginCount: 99, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
{ index: 3, account: 'DC900480004', name: 'Thea Elowen Hale', region: '新加坡', loginCount: 99, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
{ index: 4, account: 'DC900480004', name: 'viên แก้ว หลาว', region: '泰国', loginCount: 99, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
{ index: 5, account: 'DC900480004', name: 'viên แก้ว หลาว', region: '越南', loginCount: 99, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
{ index: 6, account: 'DC900480004', name: 'Cien Yong Hao', region: '中国', loginCount: 9999, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
{ index: 7, account: 'DC900480004', name: 'Cien Yong Hao', region: '美国', loginCount: 999, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
{ index: 8, account: 'DC900480004', name: 'Tiên Linh Vinh Hảo', region: '新加坡', loginCount: 999, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
{ index: 9, account: 'DC900480004', name: 'Tiên Linh Vinh Hảo', region: '新加坡', loginCount: 999, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
{ index: 10, account: 'DC900480004', name: 'Tiên Linh Vinh Hảo', region: '香港', loginCount: 999, totalDuration: '99小时99分钟99秒', avgDuration: '99小时99分钟99秒', deepMate: '99小时99分钟99秒', deepExplore: '99小时99分钟99秒' },
]);
const tableData = ref([]);
const handleTableSearch = () => {
currentPage.value = 1;
fetchTableData();
};
const handleTableReset = () => {
tableAccount.value = '';
tableRegion.value = '';
tableDateRange.value = '';
currentPage.value = 1;
fetchTableData();
};
const handlePageChange = (page) => {
currentPage.value = page;
fetchTableData();
};
const handleSizeChange = (size) => {
pageSize.value = size;
currentPage.value = 1;
fetchTableData();
};
const fetchTableData = async () => {
const params = {
page: currentPage.value,
page_size: pageSize.value
};
if (tableAccount.value) params.jwcode = tableAccount.value;
if (tableRegion.value && tableRegion.value !== 'all') params.region = tableRegion.value;
if (tableDateRange.value && tableDateRange.value.length === 2) {
params.startTime = formatDate(tableDateRange.value[0]);
params.endTime = formatDate(tableDateRange.value[1]);
}
try {
const res = await getDeepChartActiveUserList(params);
console.log("获取DeepChart活跃用户明细响应:", res);
const data = res.data || res; //
if (data && data.list) {
tableData.value = data.list.map((item, index) => ({
index: (currentPage.value - 1) * pageSize.value + index + 1,
account: item.jwcode,
name: item.username,
region: item.region,
loginCount: item.login_count,
totalDuration: formatDuration(item.stay_time),
avgDuration: formatDuration(item.avg_stay_time),
deepMate: item.deepmate_count,
deepExplore: item.dive_seek_count,
marketInfo: item.market_info_count, //
updateTime: item.update_time // 使 update_time
}));
total.value = data.total || 0;
} else {
tableData.value = [];
total.value = 0;
}
} catch (e) {
console.error('获取DeepChart活跃用户明细失败:', e);
}
};
// ( -> )
const formatDuration = (seconds) => {
if (!seconds) return '0秒';
const h = Math.floor(seconds / 3600);
const m = Math.floor((seconds % 3600) / 60);
const s = seconds % 60;
let str = '';
if (h > 0) str += `${h}小时`;
if (m > 0) str += `${m}分钟`;
if (s > 0) str += `${s}`;
return str || '0秒';
};
const headerCellStyle = { const headerCellStyle = {
background: '#f5f7fa', background: '#f5f7fa',
@ -292,6 +387,8 @@ const initChart = () => {
onMounted(() => { onMounted(() => {
nextTick(() => { nextTick(() => {
initChart(); initChart();
fetchTableData();
fetchRegionOptions();
}); });
}); });
</script> </script>

Loading…
Cancel
Save