调整管理员页面
This commit is contained in:
@@ -4,8 +4,9 @@
|
||||
<div class="admin_state">
|
||||
|
||||
<div class="admin_state_item">
|
||||
<span>State Time:</span>
|
||||
<span>Start Date:</span>
|
||||
<a-range-picker
|
||||
style="width:280px"
|
||||
class="range_picker"
|
||||
v-model:value="rangePickerValue"
|
||||
:placeholder="[
|
||||
@@ -22,8 +23,8 @@
|
||||
</a-range-picker>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>End Time:</span>
|
||||
<a-time-range-picker class="range_picker" valueFormat="HH:mm:ss" v-model:value="rangeTimeValue" />
|
||||
<span>Start Time:</span>
|
||||
<a-time-range-picker style="width:280px" class="range_picker" valueFormat="HH:mm:ss" v-model:value="rangeTimeValue" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -177,24 +178,6 @@ export default defineComponent({
|
||||
];
|
||||
});
|
||||
|
||||
let state:any = ref([
|
||||
{
|
||||
name:'all',
|
||||
value:'',
|
||||
},
|
||||
{
|
||||
name:'unprocessed',
|
||||
value:0,
|
||||
},
|
||||
{
|
||||
name:'pending',
|
||||
value:1,
|
||||
},
|
||||
{
|
||||
name:'rejected',
|
||||
value:2,
|
||||
},
|
||||
])
|
||||
let dataList: any = ref([]);
|
||||
let status: any = ref(0);
|
||||
return {
|
||||
@@ -204,7 +187,6 @@ export default defineComponent({
|
||||
dataList,
|
||||
renameData,
|
||||
status,
|
||||
state,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
@@ -292,6 +274,3 @@ export default defineComponent({
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less">
|
||||
|
||||
</style>
|
||||
@@ -1,224 +1,510 @@
|
||||
<template>
|
||||
<div class="admin_page">
|
||||
<div class="admin_table_search">
|
||||
</div>
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
<div class="admin_state_item">
|
||||
<span>Create Time:</span>
|
||||
<a-range-picker
|
||||
style="width: 250px"
|
||||
class="range_picker"
|
||||
v-model:value="rangePickerValue"
|
||||
:placeholder="[
|
||||
$t('HistoryPage.StartDate'),
|
||||
$t('HistoryPage.EndDate'),
|
||||
]"
|
||||
valueFormat="YYYY-MM-DD"
|
||||
>
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
</template>
|
||||
</a-range-picker>
|
||||
</div>
|
||||
<!-- <div class="admin_state_item">
|
||||
<span>Type:</span>
|
||||
<a-select v-model:value="userType" size="large" style="width:250px" optionFilterProp="label" :options="state" placeholder="Please select" allowClear show-search></a-select>
|
||||
</div> -->
|
||||
<div class="admin_state_item">
|
||||
<span>Country:</span>
|
||||
<a-select
|
||||
v-model:value="country"
|
||||
:allowClear="true"
|
||||
show-search
|
||||
style="width: 250px"
|
||||
:filter-option="filterOption"
|
||||
placeholder="Select Item..."
|
||||
max-tag-count="responsive"
|
||||
:options="allCountry"
|
||||
></a-select>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>Email:</span>
|
||||
<input
|
||||
v-model="email"
|
||||
placeholder="Please enter email"
|
||||
@keydown.enter="gettrialList"
|
||||
type="text"
|
||||
style="width: 250px"
|
||||
/>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>User Name:</span>
|
||||
<a-select
|
||||
v-model:value="ids"
|
||||
mode="multiple"
|
||||
style="width: 250px"
|
||||
:filter-option="filterOption"
|
||||
placeholder="Select Item..."
|
||||
max-tag-count="responsive"
|
||||
:options="allUserList"
|
||||
@keydown.enter="gettrialList"
|
||||
></a-select>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>User Type:</span>
|
||||
<a-select
|
||||
v-model:value="systemUser"
|
||||
size="large"
|
||||
style="width: 250px"
|
||||
optionFilterProp="label"
|
||||
:options="state"
|
||||
placeholder="Please select"
|
||||
allowClear
|
||||
show-search
|
||||
></a-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
<div class="admin_search_item" @click="searchHistoryList">
|
||||
Search
|
||||
</div>
|
||||
<div class="admin_search_item" @click="addhHistoryList">
|
||||
Add
|
||||
</div>
|
||||
</div>
|
||||
<div class="admin_state_list">
|
||||
<div
|
||||
class="admin_state_list_item"
|
||||
@click="lastGeTrialList('year')"
|
||||
>
|
||||
Last year
|
||||
</div>
|
||||
<div
|
||||
class="admin_state_list_item"
|
||||
@click="lastGeTrialList('month')"
|
||||
>
|
||||
Last month
|
||||
</div>
|
||||
<div
|
||||
class="admin_state_list_item"
|
||||
@click="lastGeTrialList('week')"
|
||||
>
|
||||
Last week
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="allUser_table_content" ref="historyTable">
|
||||
<a-table
|
||||
:columns="columns"
|
||||
:data-source="dataList"
|
||||
:scroll="{ y: historyTableHeight}"
|
||||
@change="changePage"
|
||||
@resizeColumn="handleResizeColumn"
|
||||
:pagination="{
|
||||
showSizeChanger: true,
|
||||
current: currentPage,
|
||||
pageSize: pageSize,
|
||||
total: total,
|
||||
showQuickJumper: true,
|
||||
bordered: false,
|
||||
}"
|
||||
>
|
||||
<!-- <template
|
||||
#bodyCell="{ column, text, record, index }"
|
||||
>
|
||||
|
||||
</template> -->
|
||||
</a-table>
|
||||
</div>
|
||||
<div class="admin_table_content" ref="historyTable">
|
||||
<a-table
|
||||
@resizeColumn="handleResizeColumn"
|
||||
:loading="tableLoading"
|
||||
:columns="columns"
|
||||
:data-source="dataList"
|
||||
:scroll="{ y: historyTableHeight }"
|
||||
@change="changePage"
|
||||
:showSorterTooltip='false'
|
||||
:pagination="{
|
||||
showSizeChanger: true,
|
||||
current: currentPage,
|
||||
pageSize: pageSize,
|
||||
total: total,
|
||||
showQuickJumper: true,
|
||||
bordered: false,
|
||||
}"
|
||||
>
|
||||
<template #bodyCell="{ column, text, record, index }">
|
||||
<div class="operate_list" v-if="column?.Operations">
|
||||
<div
|
||||
class="operate_item"
|
||||
@click="setAagree(record)"
|
||||
>
|
||||
Edit
|
||||
</div>
|
||||
<!-- <div
|
||||
class="operate_item"
|
||||
@click="deleteGroup(record, index)"
|
||||
>
|
||||
Delete
|
||||
</div> -->
|
||||
</div>
|
||||
</template>
|
||||
</a-table>
|
||||
</div>
|
||||
<allUserPoerationsVue ref="allUserPoerationsVue" @searchHistoryList="searchHistoryList"></allUserPoerationsVue>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, createVNode, computed } from "vue";
|
||||
import {
|
||||
defineComponent,
|
||||
ref,
|
||||
createVNode,
|
||||
computed,
|
||||
reactive,
|
||||
toRefs,
|
||||
onMounted,
|
||||
} from "vue";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import { Https } from "@/tool/https";
|
||||
import type { TableColumnsType } from 'ant-design-vue';
|
||||
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
|
||||
import allUserPoerationsVue from "./allUserPoerations.vue";
|
||||
export default defineComponent({
|
||||
components: {
|
||||
},
|
||||
components: {allUserPoerationsVue,},
|
||||
setup() {
|
||||
let filter: any = reactive({
|
||||
dataList: [],
|
||||
tableLoading: false,
|
||||
allUserList: [],
|
||||
allCountry:[]
|
||||
});
|
||||
let filterData: any = reactive({
|
||||
rangePickerValue: [],
|
||||
currentPage: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
country: "",
|
||||
email: "",
|
||||
userType: "",
|
||||
ids: [],
|
||||
occupation: "",
|
||||
systemUser: "",
|
||||
order: "", //'Ascending 升序 Descending 降序'
|
||||
orderBy:'',
|
||||
userName: "",
|
||||
});
|
||||
let state: any = ref([
|
||||
{
|
||||
label: "all",
|
||||
value: "",
|
||||
},
|
||||
{
|
||||
label: "visitor",
|
||||
value: "1",
|
||||
},
|
||||
{
|
||||
label: "trial",
|
||||
value: "2",
|
||||
},
|
||||
{
|
||||
label: "official",
|
||||
value: "3",
|
||||
},
|
||||
{
|
||||
label: "userInEvent",
|
||||
value: "4",
|
||||
},
|
||||
]);
|
||||
let renameData: any = ref({}); //修改名字选中的数据
|
||||
const columns: any = ref<TableColumnsType>([
|
||||
const columns: any = computed(() => {
|
||||
return [
|
||||
{
|
||||
title: 'Email',
|
||||
title: "User Id",
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
width: 50,
|
||||
|
||||
dataIndex: "email",
|
||||
key: "email",
|
||||
},
|
||||
{
|
||||
title: 'User Id',
|
||||
align: "center",
|
||||
width: 50,
|
||||
|
||||
dataIndex: "id",
|
||||
key: "id",
|
||||
},
|
||||
{
|
||||
title: 'User Name',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
width: 50,
|
||||
|
||||
dataIndex: "userName",
|
||||
key: "userName",
|
||||
},
|
||||
{
|
||||
title: 'Given Name',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
width: 50,
|
||||
|
||||
dataIndex: "givenName",
|
||||
key: "givenName",
|
||||
width:100,
|
||||
fixed: "left",
|
||||
sorter: true,
|
||||
},
|
||||
{
|
||||
title: 'Create Time',
|
||||
title: "Email",
|
||||
align: "center",
|
||||
width: 50,
|
||||
|
||||
dataIndex: "createTime",
|
||||
key: "createTime",
|
||||
dataIndex: "userEmail",
|
||||
key: "userEmail",
|
||||
width:200,
|
||||
ellipsis:true
|
||||
},
|
||||
{
|
||||
title: 'Title',
|
||||
{
|
||||
title: "User Name",
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
width: 50,
|
||||
//
|
||||
dataIndex: "title",
|
||||
key: "title",
|
||||
dataIndex: "userName",
|
||||
key: "userName",
|
||||
width:150,
|
||||
ellipsis:true
|
||||
// customRender: (record: any) => {
|
||||
// let time = formatTime(
|
||||
// record.text / 1000,
|
||||
// "YYYY-MM-DD hh:mm:ss"
|
||||
// );
|
||||
// return time;
|
||||
// },
|
||||
},
|
||||
{
|
||||
title: 'Country',
|
||||
{
|
||||
title: "language",
|
||||
align: "center",
|
||||
dataIndex: "language",
|
||||
key: "language",
|
||||
width:100,
|
||||
ellipsis:true,
|
||||
},
|
||||
{
|
||||
title: "Valid Start Time",
|
||||
align: "center",
|
||||
dataIndex: "validstartTime",
|
||||
key: "validstartTime",
|
||||
width:200,
|
||||
ellipsis:true
|
||||
},
|
||||
{
|
||||
title: "Valid End Time",
|
||||
align: "center",
|
||||
dataIndex: "validendTime",
|
||||
key: "validendTime",
|
||||
width:200,
|
||||
ellipsis:true
|
||||
},
|
||||
{
|
||||
title: "Country",
|
||||
align: "center",
|
||||
width: 50,
|
||||
ellipsis: true,
|
||||
dataIndex: "country",
|
||||
key: "country",
|
||||
width:100,
|
||||
},
|
||||
|
||||
]
|
||||
);
|
||||
let dataList: any = ref([]);
|
||||
let userInfo: any = {};
|
||||
{
|
||||
title: "Create Date",
|
||||
align: "center",
|
||||
dataIndex: "createDate",
|
||||
key: "createDate",
|
||||
width:200,
|
||||
sorter: true,
|
||||
},
|
||||
{
|
||||
title: "Is Beginner",
|
||||
align: "center",
|
||||
dataIndex: "isBeginner",
|
||||
key: "isBeginner",
|
||||
width:80,
|
||||
ellipsis:true,
|
||||
customRender: (record: any) => {
|
||||
let str;
|
||||
if (record.value == 1) {
|
||||
str = "Yes";
|
||||
} else {
|
||||
str = "No";
|
||||
}
|
||||
return str;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: 'Machine Room Ip',
|
||||
align: "center",
|
||||
dataIndex: "browserIdentifiers",
|
||||
key: "browserIdentifiers",
|
||||
width:200,
|
||||
sorter: true,
|
||||
},
|
||||
{
|
||||
title: "Credits",
|
||||
align: "center",
|
||||
// width: 150,
|
||||
// minWidth: 100,
|
||||
// maxWidth: 200,
|
||||
// resizable: true,
|
||||
dataIndex: "credits",
|
||||
key: "credits",
|
||||
width:100,
|
||||
sorter: true,
|
||||
},
|
||||
{
|
||||
title: 'User Type',
|
||||
align: "center",
|
||||
// width: 150,
|
||||
// minWidth: 100,
|
||||
// maxWidth: 200,
|
||||
// resizable: true,
|
||||
dataIndex: "systemUser",
|
||||
key: "systemUser",
|
||||
width:100,
|
||||
customRender: (record: any) => {
|
||||
let str;
|
||||
if (record.value == 0) {
|
||||
str = "visitor";
|
||||
} else if (record.value == 1) {
|
||||
str = "yearly";
|
||||
} else if (record.value == 2) {
|
||||
str = "monthly";
|
||||
} else if (record.value == 3) {
|
||||
str = "trial";
|
||||
} else if (record.value == 4) {
|
||||
str = "userInEvent";
|
||||
}
|
||||
return str;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "Operations",
|
||||
key: "operation",
|
||||
width:120,
|
||||
align: "center",
|
||||
fixed: "right",
|
||||
// slots:{customRender:'action'}
|
||||
Operations: true,
|
||||
},
|
||||
];
|
||||
});
|
||||
//改变页码
|
||||
let changePage = (e: any, filters:any, sorter:any) => {
|
||||
filterData.currentPage = e.current;
|
||||
filterData.pageSize = e.pageSize;
|
||||
if(sorter.order){
|
||||
if(sorter.columnKey == 'id'){
|
||||
filterData.orderBy = 'id'
|
||||
}else if(sorter.columnKey == "createDate"){
|
||||
filterData.orderBy = 'time'
|
||||
}else if(sorter.columnKey == "credits"){
|
||||
filterData.orderBy = 'credits'
|
||||
}
|
||||
}
|
||||
filterData.order = sorter.order == "descend" ? "Descending" : "Ascending";
|
||||
|
||||
gettrialList();
|
||||
};
|
||||
|
||||
//查询列表
|
||||
let searchHistoryList = () => {
|
||||
filterData.currentPage = 1;
|
||||
gettrialList();
|
||||
};
|
||||
let clearHistoryList = () => {
|
||||
filterData.rangePickerValue = [],
|
||||
filterData.currentPage = 1,
|
||||
filterData.pageSize = 10,
|
||||
filterData.total = 0,
|
||||
filterData.country = "",
|
||||
filterData.email = "",
|
||||
filterData.userType = "",
|
||||
filterData.ids = [],
|
||||
filterData.occupation = "",
|
||||
filterData.order = "", //'Ascending 升序 Descending 降序'
|
||||
filterData.orderBy = "", //'Ascending 升序 Descending 降序'
|
||||
filterData.systemUser = "",
|
||||
filterData.userName = "";
|
||||
};
|
||||
let setHistoryListData = () => {
|
||||
let startDate: any = filterData.rangePickerValue?.[0]
|
||||
? filterData.rangePickerValue[0] + " " + "00:00:00"
|
||||
: "";
|
||||
let endDate: any = filterData.rangePickerValue?.[1]
|
||||
? filterData.rangePickerValue[1] + " " + "00:00:00"
|
||||
: "";
|
||||
let data = {
|
||||
endTime: endDate,
|
||||
startTime: startDate,
|
||||
size: filterData.pageSize,
|
||||
page: filterData.currentPage,
|
||||
systemUser: filterData.systemUser,
|
||||
country: filterData.country,
|
||||
email: filterData.email,
|
||||
userType: filterData.userType,
|
||||
ids: filterData.ids,
|
||||
occupation: filterData.occupation,
|
||||
order: filterData.order,
|
||||
orderBy: filterData.orderBy,
|
||||
userName: filterData.userName,
|
||||
};
|
||||
return data;
|
||||
};
|
||||
//获取列表
|
||||
let gettrialList = () => {
|
||||
filter.tableLoading = true;
|
||||
let data = setHistoryListData();
|
||||
Https.axiosPost(Https.httpUrls.getUserInfo, data).then(
|
||||
(rv: any) => {
|
||||
if (rv) {
|
||||
// this.dataList = rv
|
||||
filter.dataList = rv.records;
|
||||
filterData.total = rv.total;
|
||||
filter.tableLoading = false;
|
||||
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
let lastGeTrialList = (str: string) => {
|
||||
clearHistoryList();
|
||||
let currentDate = new Date();
|
||||
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
|
||||
// 计算30天前的时间戳
|
||||
let thirtyDaysAgoTimestamp;
|
||||
if (str == "year") {
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - 360 * 24 * 60 * 60;
|
||||
} else if (str == "month") {
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - 30 * 24 * 60 * 60;
|
||||
} else if (str == "week") {
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - 7 * 24 * 60 * 60;
|
||||
}
|
||||
filterData.rangePickerValue[0] = formatTime(
|
||||
thirtyDaysAgoTimestamp,
|
||||
"YYYY-MM-DD"
|
||||
);
|
||||
gettrialList();
|
||||
};
|
||||
let filterOption = (input: any, option: any) => {
|
||||
// 使用 option.label 进行搜索
|
||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
|
||||
};
|
||||
let addhHistoryList = () => {
|
||||
allUserPoerationsVue.value.init('Add','')
|
||||
};
|
||||
let allUserPoerationsVue = ref()
|
||||
let setAagree = (data:any) =>{
|
||||
allUserPoerationsVue.value.init('Edit',data)
|
||||
}
|
||||
onMounted(() => {
|
||||
let allUserList: any = sessionStorage.getItem("allUserList");
|
||||
if (allUserList) {
|
||||
filter.allUserList = JSON.parse(allUserList);
|
||||
}
|
||||
let allCountry: any = sessionStorage.getItem("allCountry");
|
||||
if (allCountry) {
|
||||
filter.allCountry = JSON.parse(allCountry);
|
||||
}
|
||||
gettrialList();
|
||||
});
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
state,
|
||||
columns,
|
||||
dataList,
|
||||
renameData,
|
||||
userInfo,
|
||||
handleResizeColumn: (w:any, col:any) => {
|
||||
col.width = w;
|
||||
},
|
||||
changePage,
|
||||
searchHistoryList,
|
||||
addhHistoryList,
|
||||
lastGeTrialList,
|
||||
gettrialList,
|
||||
filterOption,
|
||||
allUserPoerationsVue,
|
||||
setAagree,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
currentPage: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
historyTableHeight: 0,
|
||||
newCollectionName: "",
|
||||
renameVisivle: false, //修改名字弹窗
|
||||
collectionName: "", //选中的名字
|
||||
searchCollectionName: "",
|
||||
handleResizeColumn: (w: any, col: any) => {
|
||||
col.width = w;
|
||||
},
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
let historyTable: any = this.$refs.historyTable;
|
||||
this.historyTableHeight = historyTable.clientHeight - 200;
|
||||
this.gettrialList();
|
||||
let userInfo:any = getCookie("userInfo")
|
||||
this.userInfo = JSON.parse(userInfo);
|
||||
},
|
||||
methods: {
|
||||
//改变页码
|
||||
changePage(e: any) {
|
||||
this.currentPage = e.current;
|
||||
this.pageSize = e.pageSize;
|
||||
// this.gettrialList();
|
||||
},
|
||||
//查询列表
|
||||
searchHistoryList() {
|
||||
this.currentPage = 1;
|
||||
this.gettrialList();
|
||||
},
|
||||
|
||||
//获取列表
|
||||
gettrialList() {
|
||||
Https.axiosGet(Https.httpUrls.inquiryGetTrial).then((rv)=>{
|
||||
this.dataList = rv
|
||||
|
||||
})
|
||||
|
||||
},
|
||||
},
|
||||
methods: {},
|
||||
});
|
||||
</script>
|
||||
<style lang="less">
|
||||
.admin_page {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
// min-width: 1440px;
|
||||
position: relative;
|
||||
|
||||
.allUser_table_content {
|
||||
margin-top: 2.6rem;
|
||||
width: 100%;
|
||||
height: calc(100% - 13.7rem);
|
||||
padding-bottom: 3rem;
|
||||
background: #fff;
|
||||
border-radius: 2rem;
|
||||
overflow: hidden;
|
||||
.ant-table {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.ant-table-body {
|
||||
overflow-y: auto !important;
|
||||
-ms-overflow-style: none;
|
||||
overflow: -moz-scrollbars-none;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
width: 0 !important;
|
||||
}
|
||||
}
|
||||
.ant-table-thead > tr > th {
|
||||
background: #ffffff00;
|
||||
border-bottom: none;
|
||||
backdrop-filter: blur(1rem);
|
||||
}
|
||||
|
||||
.ant-table-tbody > tr > td {
|
||||
border: none;
|
||||
background: transparent;
|
||||
// color: #fff;
|
||||
}
|
||||
.ant-table-tbody > tr {
|
||||
&:hover > td {
|
||||
background: #ffffff3a;
|
||||
}
|
||||
}
|
||||
.ant-table-pagination-right {
|
||||
padding-right: 3.5rem;
|
||||
}
|
||||
.operate_list {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 1rem;
|
||||
|
||||
.operate_item {
|
||||
font-size: 1.4rem;
|
||||
font-family: Roboto;
|
||||
font-weight: 400;
|
||||
color: #343579;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
<style lang="less" scoped>
|
||||
.admin_page .admin_table_search .admin_state {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
</style>
|
||||
302
src/component/Administrator/allUserPoerations.vue
Normal file
302
src/component/Administrator/allUserPoerations.vue
Normal file
@@ -0,0 +1,302 @@
|
||||
<template>
|
||||
<a-modal
|
||||
class="allUserPoeration_modal generalModel"
|
||||
v-model:visible="operationsModal"
|
||||
:footer="null"
|
||||
width="50%"
|
||||
:maskClosable="false"
|
||||
:centered="true"
|
||||
:closable="false"
|
||||
:mask="false"
|
||||
wrapClassName="#app"
|
||||
:keyboard="false"
|
||||
>
|
||||
<div class="generalModel_btn">
|
||||
<div class="generalModel_closeIcon" @click.stop="cancelDsign()">
|
||||
<i class="fi fi-rr-cross-small"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal_title_text">
|
||||
<div>{{ title }} User</div>
|
||||
</div>
|
||||
<div class="allUserPoeration_center admin_page">
|
||||
<div class="admin_state_item">
|
||||
<span style="width: 100px;">User Name:</span>
|
||||
<input
|
||||
:readonly="title != 'Add'"
|
||||
:class="{active:title != 'Add'}"
|
||||
v-model="userName"
|
||||
placeholder="Please enter user name"
|
||||
type="text"
|
||||
style="width: 250px"
|
||||
/>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span style="width: 100px;">User Email:</span>
|
||||
<input
|
||||
:readonly="title != 'Add'"
|
||||
:class="{active:title != 'Add'}"
|
||||
v-model="userEmail"
|
||||
placeholder="Please enter email"
|
||||
type="text"
|
||||
style="width: 250px"
|
||||
/>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span style="width: 100px;">Create Time:</span>
|
||||
<a-date-picker :disabled="title != 'Add'" style="width: 250px" valueFormat="YYYY-MM-DDTHH:mm:ss" class="range_picker" show-time placeholder="Create Time" v-model:value="validStartTime">
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
</template>
|
||||
</a-date-picker>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span style="width: 100px;">End Time:</span>
|
||||
<a-date-picker style="width: 250px" valueFormat="YYYY-MM-DDTHH:mm:ss" class="range_picker" show-time placeholder="End Time" v-model:value="validEndTime">
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
</template>
|
||||
</a-date-picker>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span style="width: 100px;">User Type:</span>
|
||||
<a-select
|
||||
v-model:value="systemUser"
|
||||
size="large"
|
||||
style="width: 250px"
|
||||
optionFilterProp="label"
|
||||
:options="state"
|
||||
placeholder="Please select"
|
||||
allowClear
|
||||
show-search
|
||||
></a-select>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span style="width: 100px;">Credits:</span>
|
||||
<input
|
||||
v-model="credits"
|
||||
placeholder="Please enter credits"
|
||||
type="text"
|
||||
style="width: 250px"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="admin_state_item">
|
||||
<span style="width: 100px;">Country:</span>
|
||||
<input
|
||||
:readonly="title != 'Add'"
|
||||
:class="{active:title != 'Add'}"
|
||||
v-model="country"
|
||||
placeholder="Please enter country"
|
||||
type="text"
|
||||
style="width: 250px"
|
||||
/>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="allUserPoeration_btn admin_page">
|
||||
<div class="admin_search_item" @click="cancelDsign">
|
||||
Close
|
||||
</div>
|
||||
<div class="admin_search_item" @click="setOk">
|
||||
OK
|
||||
</div>
|
||||
</div>
|
||||
</a-modal>
|
||||
<div class="mark_loading" v-show="loadingShow">
|
||||
<a-spin size="large" />
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { defineComponent, ref, reactive, watch, onMounted, nextTick, toRefs } from "vue";
|
||||
import { Https } from "@/tool/https";
|
||||
import { setCookie, getCookie } from "@/tool/cookie";
|
||||
import { Modal, message } from "ant-design-vue";
|
||||
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import allOrder from "@/component/Pay/allOrder.vue";
|
||||
import creditsDetail from "@/component/Pay/creditsDetail.vue";
|
||||
import { exportSele,JSRectUpdata,JSchangeType,JScanvasMouseDown,JSSetRemoveImage,JScreateCheck,JSSetTexture } from "@/tool/canvasDrawing";
|
||||
import { useI18n } from "vue-i18n";
|
||||
export default defineComponent({
|
||||
components: {
|
||||
creditsDetail,
|
||||
allOrder,
|
||||
},
|
||||
emits: ['searchHistoryList'],
|
||||
setup(props,{emit}) {
|
||||
let operations = reactive({
|
||||
operationsModal:false,
|
||||
operationsEdit:false,
|
||||
loadingShow:false,
|
||||
title:''
|
||||
})
|
||||
let operationsData = reactive({
|
||||
accountId:-1,
|
||||
userName:'',
|
||||
userEmail:'',
|
||||
validStartTime:'',
|
||||
validEndTime:'',
|
||||
systemUser:'',
|
||||
credits:'',
|
||||
country:'',
|
||||
})
|
||||
let state = ref([
|
||||
{
|
||||
label:'visitor',
|
||||
value:'0',
|
||||
},
|
||||
{
|
||||
label:'yearly',
|
||||
value:'1',
|
||||
},
|
||||
{
|
||||
label:'monthly',
|
||||
value:'2',
|
||||
},
|
||||
{
|
||||
label:'trial',
|
||||
value:'3',
|
||||
},
|
||||
]);
|
||||
let init = (funStr,data)=>{
|
||||
operations.operationsModal = true
|
||||
operations.operationsEdit = true
|
||||
operations.title = funStr
|
||||
if(funStr == 'Add') operations.operationsEdit = false
|
||||
if(funStr == 'Edit'){
|
||||
let startTime = data.validStartTime?formatTime(data.validStartTime / 1000,"YYYY-MM-DDThh:mm:ss"):''
|
||||
let endTime = data.validEndTime?formatTime(data.validEndTime / 1000,"YYYY-MM-DDThh:mm:ss"):''
|
||||
operationsData.accountId=data.id
|
||||
operationsData.userName=data.userName
|
||||
operationsData.userEmail=data.userEmail
|
||||
// operationsData.validStartTime='2024-08-05T00:00:06'
|
||||
// operationsData.validEndTime='2024-08-05T00:00:06'
|
||||
operationsData.validStartTime=startTime
|
||||
operationsData.validEndTime=endTime
|
||||
operationsData.systemUser=String(data.systemUser)
|
||||
operationsData.credits=data.credits
|
||||
operationsData.country=data.country
|
||||
// operationsData.accountId = data.accountId
|
||||
// operationsData.userName = data.userName
|
||||
// operationsData.userEmail = data.userEmail
|
||||
// operationsData.validStartTime = formatTime(data.validStartTime)
|
||||
// operationsData.validEndTime = formatTime(data.validEndTime)
|
||||
}
|
||||
|
||||
}
|
||||
let setTime = (time) =>{
|
||||
const date = new Date(time);
|
||||
const timestamp = date.getTime(); // 转换为秒数
|
||||
return timestamp
|
||||
}
|
||||
let setAddData = ()=>{
|
||||
setTime(operationsData.validStartTime)
|
||||
return {
|
||||
"country": operationsData.country,
|
||||
"credits": operationsData.credits,
|
||||
"systemUser": operationsData.systemUser,
|
||||
"userEmail": operationsData.userEmail,
|
||||
"userName": operationsData.userName,
|
||||
"validEndTime": setTime(operationsData.validEndTime),
|
||||
"validStartTime": setTime(operationsData.validStartTime)
|
||||
}
|
||||
}
|
||||
let setEditData = ()=>{
|
||||
return {
|
||||
"accountId": operationsData.accountId,
|
||||
"credits": operationsData.credits,
|
||||
"systemUser": operationsData.systemUser,
|
||||
"validEndTime": setTime(operationsData.validEndTime),
|
||||
}
|
||||
}
|
||||
let cancelDsign = ()=>{
|
||||
operationsData.accountId=-1
|
||||
operationsData.userName=''
|
||||
operationsData.userEmail=''
|
||||
operationsData.validStartTime=''
|
||||
operationsData.validEndTime=''
|
||||
operationsData.systemUser=''
|
||||
operationsData.credits=''
|
||||
operationsData.country=''
|
||||
operations.operationsModal = false
|
||||
}
|
||||
let setOk = ()=>{
|
||||
let data
|
||||
if(operations.title == 'Add'){
|
||||
data = setAddData()
|
||||
Https.axiosPost(Https.httpUrls.adminAddUser, data).then(
|
||||
(rv) => {
|
||||
if (rv) {
|
||||
cancelDsign()
|
||||
emit('searchHistoryList')
|
||||
}
|
||||
}
|
||||
);
|
||||
}else{
|
||||
data = setEditData()
|
||||
Https.axiosPost(Https.httpUrls.modifyUser,{},{params:data}).then(
|
||||
(rv) => {
|
||||
if (rv) {
|
||||
cancelDsign()
|
||||
emit('searchHistoryList')
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
return {
|
||||
...toRefs(operations),
|
||||
...toRefs(operationsData),
|
||||
state,
|
||||
cancelDsign,
|
||||
init,
|
||||
setOk,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
};
|
||||
},
|
||||
mounted() {},
|
||||
methods: {
|
||||
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less">
|
||||
.allUserPoeration_modal{
|
||||
.ant-modal-body{
|
||||
height: auto;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
<style lang="less" scoped>
|
||||
|
||||
.allUserPoeration_modal {
|
||||
.closeIcon {
|
||||
z-index: 2;
|
||||
}
|
||||
.allUserPoeration_btn{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
height: auto;
|
||||
justify-content: flex-end;
|
||||
padding: 1rem 0;
|
||||
.admin_search_item{
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
.allUserPoeration_center{
|
||||
height: 85%;
|
||||
overflow-y: auto
|
||||
}
|
||||
}
|
||||
</style>
|
||||
227
src/component/Administrator/recentActiveChart.vue
Normal file
227
src/component/Administrator/recentActiveChart.vue
Normal file
@@ -0,0 +1,227 @@
|
||||
<template>
|
||||
<div class="recentActiveChart admin_page">
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
|
||||
<div class="admin_state_item">
|
||||
<span>State Time:</span>
|
||||
<a-range-picker
|
||||
style="width:280px"
|
||||
class="range_picker"
|
||||
v-model:value="rangePickerValue"
|
||||
:allowClear="false"
|
||||
:placeholder="[
|
||||
$t('HistoryPage.StartDate'),
|
||||
$t('HistoryPage.EndDate'),
|
||||
]"
|
||||
valueFormat="YYYY-MM-DD"
|
||||
>
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
</template>
|
||||
</a-range-picker>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>User:</span>
|
||||
<a-select
|
||||
v-model:value="userIdList"
|
||||
mode="multiple"
|
||||
style="width: 280px"
|
||||
:filter-option="filterOption"
|
||||
placeholder="Select Item..."
|
||||
max-tag-count="responsive"
|
||||
:options="dataList"
|
||||
></a-select>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
<div class="admin_search_item" @click="searchHistoryList">Search</div>
|
||||
</div>
|
||||
<div class="admin_state_list">
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('year')">Last year</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('month')">Last month</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('week')">Last week</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="admin_table_content" ref="pageChartDom">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounted } from "vue";
|
||||
import { Https } from "@/tool/https";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import * as echarts from 'echarts/core';
|
||||
import { TooltipComponent, LegendComponent } from 'echarts/components';
|
||||
import { PieChart } from 'echarts/charts';
|
||||
import { LabelLayout } from 'echarts/features';
|
||||
import { CanvasRenderer } from 'echarts/renderers';
|
||||
export default defineComponent({
|
||||
components: {
|
||||
},
|
||||
setup() {
|
||||
let filter:any = reactive({
|
||||
dataList:[],
|
||||
})
|
||||
|
||||
let filterData:any = reactive({
|
||||
rangePickerValue:[],
|
||||
userIdList:[]
|
||||
})
|
||||
//查询列表
|
||||
let searchHistoryList = ()=> {
|
||||
gettrialList();
|
||||
}
|
||||
let getUserIDName = ()=>{
|
||||
let allUserList:any = sessionStorage.getItem('allUserList');
|
||||
if(allUserList){
|
||||
filter.dataList = JSON.parse(allUserList)
|
||||
}
|
||||
// Https.axiosGet(Https.httpUrls.getAllUserId,).then((rv: any) => {
|
||||
// if (rv) {
|
||||
// let username = sessionStorage.getItem('allUserList');
|
||||
// sessionStorage.setItem('allUserList',rv);
|
||||
// filter.dataList = rv
|
||||
// }
|
||||
// })
|
||||
}
|
||||
//获取列表
|
||||
let gettrialList = async () =>{
|
||||
filter.tableLoading = true
|
||||
let startDate: any = filterData.rangePickerValue?.[0]
|
||||
? filterData.rangePickerValue[0]+' '+'00:00:00'
|
||||
: "";
|
||||
let endDate: any = filterData.rangePickerValue?.[1]
|
||||
? filterData.rangePickerValue[1]+' '+'00:00:00'
|
||||
: "";
|
||||
let data = {
|
||||
endTime:endDate,
|
||||
startTime:startDate,
|
||||
userIdList:filterData.userIdList.join(','),
|
||||
}
|
||||
Https.axiosGet(Https.httpUrls.getActiveUserFunc,{params:data}).then((rv: any) => {
|
||||
if (rv) {
|
||||
let data:any = []
|
||||
rv.names.forEach((item:any,index:number) => {
|
||||
let obj = {
|
||||
name : item,
|
||||
value:rv.values[index],
|
||||
}
|
||||
data.push(obj)
|
||||
});
|
||||
setEcharts(data)
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
let myChart:any
|
||||
let setEcharts = (data:any) =>{
|
||||
if (myChart) {
|
||||
myChart.setOption({
|
||||
series: [{
|
||||
data: data
|
||||
}]
|
||||
});
|
||||
}else{
|
||||
echarts.use([
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
PieChart,
|
||||
CanvasRenderer,
|
||||
LabelLayout
|
||||
]);
|
||||
var chartDom = pageChartDom.value;
|
||||
myChart = echarts.init(chartDom);
|
||||
var option;
|
||||
|
||||
option = {
|
||||
tooltip: {
|
||||
trigger: 'item'
|
||||
},
|
||||
legend: {
|
||||
top: '5%',
|
||||
left: 'center'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'pie',
|
||||
radius: ['40%', '70%'],
|
||||
avoidLabelOverlap: false,
|
||||
|
||||
itemStyle: {
|
||||
borderRadius: 10
|
||||
},
|
||||
label: {
|
||||
show: false,
|
||||
position: 'center'
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: 30,
|
||||
fontWeight: 'bold'
|
||||
},
|
||||
},
|
||||
labelLine: {
|
||||
show: false
|
||||
},
|
||||
stillShowZeroSum:true,
|
||||
data: data
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
option && myChart.setOption(option);
|
||||
}
|
||||
|
||||
}
|
||||
let lastGeTrialList = (str:string)=>{
|
||||
let currentDate = new Date();
|
||||
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
|
||||
// 计算30天前的时间戳
|
||||
let thirtyDaysAgoTimestamp
|
||||
if(str == 'year'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (360 * 24 * 60 * 60);
|
||||
}else if(str == 'month'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (30 * 24 * 60 * 60);
|
||||
}else if(str == 'week'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (7 * 24 * 60 * 60);
|
||||
}
|
||||
filterData.rangePickerValue = [formatTime(thirtyDaysAgoTimestamp,'YYYY-MM-DD'),formatTime(currentTimestamp,'YYYY-MM-DD')]
|
||||
gettrialList();
|
||||
}
|
||||
let pageChartDom:any = ref()
|
||||
let filterOption = (input:any, option:any)=>{
|
||||
// 使用 option.label 进行搜索
|
||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
|
||||
}
|
||||
onMounted(()=>{
|
||||
lastGeTrialList('month')
|
||||
getUserIDName()
|
||||
})
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
searchHistoryList,
|
||||
gettrialList,
|
||||
pageChartDom,
|
||||
lastGeTrialList,
|
||||
filterOption,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
|
||||
},
|
||||
});
|
||||
</script>
|
||||
303
src/component/Administrator/recentActiveUser.vue
Normal file
303
src/component/Administrator/recentActiveUser.vue
Normal file
@@ -0,0 +1,303 @@
|
||||
<template>
|
||||
<div class="recentActiveChart admin_page">
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
|
||||
<div class="admin_state_item">
|
||||
<span>State Time:</span>
|
||||
<a-range-picker
|
||||
style="width:280px"
|
||||
class="range_picker"
|
||||
v-model:value="rangePickerValue"
|
||||
:allowClear="false"
|
||||
:placeholder="[
|
||||
$t('HistoryPage.StartDate'),
|
||||
$t('HistoryPage.EndDate'),
|
||||
]"
|
||||
valueFormat="YYYY-MM-DD"
|
||||
>
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
</template>
|
||||
</a-range-picker>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
<div class="admin_search_item" @click="searchHistoryList">Search</div>
|
||||
</div>
|
||||
<div class="admin_state_list">
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('year')">Last year</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('month')">Last month</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('week')">Last week</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="admin_table_content" ref="historyTable">
|
||||
<a-table
|
||||
@resizeColumn="handleResizeColumn"
|
||||
:loading="tableLoading"
|
||||
:columns="columns"
|
||||
:data-source="dataList"
|
||||
:scroll="{ y: historyTableHeight }"
|
||||
:showSorterTooltip='false'
|
||||
@change="changePage"
|
||||
:pagination="{
|
||||
showSizeChanger: true,
|
||||
current: currentPage,
|
||||
pageSize: pageSize,
|
||||
total: total,
|
||||
showQuickJumper: true,
|
||||
bordered: false,
|
||||
}"
|
||||
>
|
||||
</a-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounted } from "vue";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import { Https } from "@/tool/https";
|
||||
export default defineComponent({
|
||||
components: {
|
||||
},
|
||||
setup() {
|
||||
let filter:any = reactive({
|
||||
dataList:[],
|
||||
tableLoading:false,
|
||||
})
|
||||
let filterData:any = reactive({
|
||||
rangePickerValue:[],
|
||||
currentPage: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
})
|
||||
let renameData: any = ref({}); //修改名字选中的数据
|
||||
const columns: any = computed(() => {
|
||||
return [
|
||||
{
|
||||
title: "User Id",
|
||||
align: "center",
|
||||
dataIndex: "id",
|
||||
key: "id",
|
||||
width:100,
|
||||
fixed: "left",
|
||||
sorter: true,
|
||||
},
|
||||
{
|
||||
title: "Email",
|
||||
align: "center",
|
||||
dataIndex: "userEmail",
|
||||
key: "userEmail",
|
||||
width:200,
|
||||
ellipsis:true
|
||||
},
|
||||
{
|
||||
title: "User Name",
|
||||
align: "center",
|
||||
dataIndex: "userName",
|
||||
key: "userName",
|
||||
width:150,
|
||||
ellipsis:true
|
||||
// customRender: (record: any) => {
|
||||
// let time = formatTime(
|
||||
// record.text / 1000,
|
||||
// "YYYY-MM-DD hh:mm:ss"
|
||||
// );
|
||||
// return time;
|
||||
// },
|
||||
},
|
||||
{
|
||||
title: "language",
|
||||
align: "center",
|
||||
dataIndex: "language",
|
||||
key: "language",
|
||||
width:100,
|
||||
ellipsis:true,
|
||||
},
|
||||
{
|
||||
title: "Valid Start Time",
|
||||
align: "center",
|
||||
dataIndex: "validstartTime",
|
||||
key: "validstartTime",
|
||||
width:200,
|
||||
ellipsis:true
|
||||
},
|
||||
{
|
||||
title: "Valid End Time",
|
||||
align: "center",
|
||||
dataIndex: "validendTime",
|
||||
key: "validendTime",
|
||||
width:200,
|
||||
ellipsis:true
|
||||
},
|
||||
{
|
||||
title: "Country",
|
||||
align: "center",
|
||||
dataIndex: "country",
|
||||
key: "country",
|
||||
width:100,
|
||||
},
|
||||
{
|
||||
title: "Create Date",
|
||||
align: "center",
|
||||
dataIndex: "createDate",
|
||||
key: "createDate",
|
||||
width:200,
|
||||
sorter: true,
|
||||
},
|
||||
{
|
||||
title: "Is Beginner",
|
||||
align: "center",
|
||||
dataIndex: "isBeginner",
|
||||
key: "isBeginner",
|
||||
width:80,
|
||||
ellipsis:true,
|
||||
customRender: (record: any) => {
|
||||
let str;
|
||||
if (record.value == 1) {
|
||||
str = "Yes";
|
||||
} else {
|
||||
str = "No";
|
||||
}
|
||||
return str;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: 'Machine Room Ip',
|
||||
align: "center",
|
||||
dataIndex: "browserIdentifiers",
|
||||
key: "browserIdentifiers",
|
||||
width:200,
|
||||
sorter: true,
|
||||
},
|
||||
{
|
||||
title: "Credits",
|
||||
align: "center",
|
||||
// width: 150,
|
||||
// minWidth: 100,
|
||||
// maxWidth: 200,
|
||||
// resizable: true,
|
||||
dataIndex: "credits",
|
||||
key: "credits",
|
||||
width:100,
|
||||
sorter: true,
|
||||
},
|
||||
{
|
||||
title: 'User Type',
|
||||
align: "center",
|
||||
// width: 150,
|
||||
// minWidth: 100,
|
||||
// maxWidth: 200,
|
||||
// resizable: true,
|
||||
dataIndex: "systemUser",
|
||||
key: "systemUser",
|
||||
width:100,
|
||||
customRender: (record: any) => {
|
||||
let str;
|
||||
if (record.value == 0) {
|
||||
str = "visitor";
|
||||
} else if (record.value == 1) {
|
||||
str = "yearly";
|
||||
} else if (record.value == 2) {
|
||||
str = "monthly";
|
||||
} else if (record.value == 3) {
|
||||
str = "trial";
|
||||
} else if (record.value == 4) {
|
||||
str = "userInEvent";
|
||||
}
|
||||
return str;
|
||||
},
|
||||
},
|
||||
|
||||
];
|
||||
});
|
||||
//改变页码
|
||||
let changePage = (e: any) => {
|
||||
filterData.currentPage = e.current;
|
||||
filterData.pageSize = e.pageSize;
|
||||
// gettrialList();
|
||||
}
|
||||
|
||||
//查询列表
|
||||
let searchHistoryList = ()=> {
|
||||
filterData.currentPage = 1;
|
||||
gettrialList();
|
||||
}
|
||||
|
||||
//获取列表
|
||||
let gettrialList = () =>{
|
||||
filter.tableLoading = true
|
||||
let startDate: any = filterData.rangePickerValue?.[0]
|
||||
? filterData.rangePickerValue[0]+' '+'00:00:00'
|
||||
: "";
|
||||
let endDate: any = filterData.rangePickerValue?.[1]
|
||||
? filterData.rangePickerValue[1]+' '+'00:00:00'
|
||||
: "";
|
||||
let data = {
|
||||
endTime:endDate,
|
||||
startTime:startDate,
|
||||
size:filterData.pageSize,
|
||||
page:filterData.currentPage,
|
||||
}
|
||||
Https.axiosGet(Https.httpUrls.recentActiveUser,{params:data}).then((rv: any) => {
|
||||
if (rv) {
|
||||
// this.dataList = rv
|
||||
filter.dataList = rv.records
|
||||
console.log(rv);
|
||||
filterData.total = rv.total
|
||||
filter.tableLoading = false
|
||||
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
})
|
||||
}
|
||||
let lastGeTrialList = (str:string)=>{
|
||||
let currentDate = new Date();
|
||||
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
|
||||
// 计算30天前的时间戳
|
||||
let thirtyDaysAgoTimestamp
|
||||
if(str == 'year'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (360 * 24 * 60 * 60);
|
||||
}else if(str == 'month'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (30 * 24 * 60 * 60);
|
||||
}else if(str == 'week'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (7 * 24 * 60 * 60);
|
||||
}
|
||||
filterData.rangePickerValue = [formatTime(thirtyDaysAgoTimestamp,'YYYY-MM-DD'),formatTime(currentTimestamp,'YYYY-MM-DD')]
|
||||
gettrialList();
|
||||
}
|
||||
onMounted(()=>{
|
||||
lastGeTrialList('month')
|
||||
})
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
columns,
|
||||
renameData,
|
||||
changePage,
|
||||
searchHistoryList,
|
||||
lastGeTrialList,
|
||||
gettrialList,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
historyTableHeight: 0,
|
||||
handleResizeColumn: (w:any, col:any) => {
|
||||
col.width = w;
|
||||
},
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
let historyTable: any = this.$refs.historyTable;
|
||||
this.historyTableHeight = historyTable.clientHeight - 200;
|
||||
},
|
||||
methods: {
|
||||
|
||||
},
|
||||
});
|
||||
</script>
|
||||
195
src/component/Administrator/recentActiveUserChart.vue
Normal file
195
src/component/Administrator/recentActiveUserChart.vue
Normal file
@@ -0,0 +1,195 @@
|
||||
<template>
|
||||
<div class="recentActiveChart admin_page">
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
|
||||
<div class="admin_state_item">
|
||||
<span>State Time:</span>
|
||||
<a-range-picker
|
||||
style="width:280px"
|
||||
class="range_picker"
|
||||
v-model:value="rangePickerValue"
|
||||
:allowClear="false"
|
||||
:placeholder="[
|
||||
$t('HistoryPage.StartDate'),
|
||||
$t('HistoryPage.EndDate'),
|
||||
]"
|
||||
valueFormat="YYYY-MM-DD"
|
||||
>
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
</template>
|
||||
</a-range-picker>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
<div class="admin_search_item" @click="searchHistoryList">Search</div>
|
||||
</div>
|
||||
<div class="admin_state_list">
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('year')">Last year</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('month')">Last month</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('week')">Last week</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="admin_table_content" ref="pageChartDom">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounted } from "vue";
|
||||
import { Https } from "@/tool/https";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import * as echarts from 'echarts/core';
|
||||
import { TooltipComponent, LegendComponent } from 'echarts/components';
|
||||
import { PieChart } from 'echarts/charts';
|
||||
import { LabelLayout } from 'echarts/features';
|
||||
import { CanvasRenderer } from 'echarts/renderers';
|
||||
export default defineComponent({
|
||||
components: {
|
||||
},
|
||||
setup() {
|
||||
let filter:any = reactive({
|
||||
dataList:{},
|
||||
})
|
||||
|
||||
let filterData:any = reactive({
|
||||
rangePickerValue:[],
|
||||
})
|
||||
//查询列表
|
||||
let searchHistoryList = ()=> {
|
||||
gettrialList();
|
||||
}
|
||||
//获取列表
|
||||
let gettrialList = async () =>{
|
||||
filter.tableLoading = true
|
||||
let startDate: any = filterData.rangePickerValue?.[0]
|
||||
? filterData.rangePickerValue[0]+' '+'00:00:00'
|
||||
: "";
|
||||
let endDate: any = filterData.rangePickerValue?.[1]
|
||||
? filterData.rangePickerValue[1]+' '+'00:00:00'
|
||||
: "";
|
||||
let data = {
|
||||
endTime:endDate,
|
||||
startTime:startDate,
|
||||
}
|
||||
Https.axiosGet(Https.httpUrls.recentActiveUserChart,{params:data}).then((rv: any) => {
|
||||
if (rv) {
|
||||
let data:any = []
|
||||
rv.names.forEach((item:any,index:number) => {
|
||||
let obj = {
|
||||
name : item,
|
||||
value:rv.values[index],
|
||||
}
|
||||
data.push(obj)
|
||||
});
|
||||
filter.dataList = data
|
||||
setEcharts(data)
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
let myChart:any
|
||||
let setEcharts = (data:any) =>{
|
||||
if (myChart) {
|
||||
myChart.setOption({
|
||||
series: [{
|
||||
data: data
|
||||
}]
|
||||
});
|
||||
}else{
|
||||
echarts.use([
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
PieChart,
|
||||
CanvasRenderer,
|
||||
LabelLayout
|
||||
]);
|
||||
var chartDom = pageChartDom.value;
|
||||
myChart = echarts.init(chartDom);
|
||||
var option;
|
||||
|
||||
option = {
|
||||
tooltip: {
|
||||
trigger: 'item'
|
||||
},
|
||||
legend: {
|
||||
top: '10%',
|
||||
left: 'center'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'pie',
|
||||
radius: ['30%', '70%'],
|
||||
avoidLabelOverlap: false,
|
||||
|
||||
itemStyle: {
|
||||
borderRadius: 10
|
||||
},
|
||||
label: {
|
||||
show: false,
|
||||
position: 'center'
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: 30,
|
||||
fontWeight: 'bold'
|
||||
}
|
||||
},
|
||||
labelLine: {
|
||||
show: false
|
||||
},
|
||||
stillShowZeroSum:true,
|
||||
data: data
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
option && myChart.setOption(option);
|
||||
}
|
||||
|
||||
}
|
||||
let lastGeTrialList = (str:string)=>{
|
||||
let currentDate = new Date();
|
||||
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
|
||||
// 计算30天前的时间戳
|
||||
let thirtyDaysAgoTimestamp
|
||||
if(str == 'year'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (360 * 24 * 60 * 60);
|
||||
}else if(str == 'month'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (30 * 24 * 60 * 60);
|
||||
}else if(str == 'week'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (7 * 24 * 60 * 60);
|
||||
}
|
||||
filterData.rangePickerValue = [formatTime(thirtyDaysAgoTimestamp,'YYYY-MM-DD'),formatTime(currentTimestamp,'YYYY-MM-DD')]
|
||||
gettrialList();
|
||||
}
|
||||
let pageChartDom:any = ref()
|
||||
onMounted(()=>{
|
||||
lastGeTrialList('month')
|
||||
})
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
searchHistoryList,
|
||||
gettrialList,
|
||||
pageChartDom,
|
||||
lastGeTrialList,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
|
||||
},
|
||||
});
|
||||
</script>
|
||||
320
src/component/Administrator/recentNewUser.vue
Normal file
320
src/component/Administrator/recentNewUser.vue
Normal file
@@ -0,0 +1,320 @@
|
||||
<template>
|
||||
<div class="recentNewUser admin_page">
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
|
||||
<div class="admin_state_item">
|
||||
<span>State Time:</span>
|
||||
<a-range-picker
|
||||
style="width:280px"
|
||||
class="range_picker"
|
||||
v-model:value="rangePickerValue"
|
||||
:allowClear="false"
|
||||
:placeholder="[
|
||||
$t('HistoryPage.StartDate'),
|
||||
$t('HistoryPage.EndDate'),
|
||||
]"
|
||||
valueFormat="YYYY-MM-DD"
|
||||
>
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
</template>
|
||||
</a-range-picker>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>Type:</span>
|
||||
<a-select v-model:value="userType" size="large" style="width:280px" optionFilterProp="label" :options="state" placeholder="Please select" allowClear show-search></a-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
<div class="admin_search_item" @click="searchHistoryList">Search</div>
|
||||
</div>
|
||||
<div class="admin_state_list">
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('year')">Last year</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('month')">Last month</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('week')">Last week</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="admin_table_content" ref="historyTable">
|
||||
<a-table
|
||||
@resizeColumn="handleResizeColumn"
|
||||
:loading="tableLoading"
|
||||
:columns="columns"
|
||||
:data-source="dataList"
|
||||
:scroll="{ y: historyTableHeight }"
|
||||
@change="changePage"
|
||||
:pagination="{
|
||||
showSizeChanger: true,
|
||||
current: currentPage,
|
||||
pageSize: pageSize,
|
||||
total: total,
|
||||
showQuickJumper: true,
|
||||
bordered: false,
|
||||
}"
|
||||
>
|
||||
</a-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounted } from "vue";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import { Https } from "@/tool/https";
|
||||
export default defineComponent({
|
||||
components: {
|
||||
},
|
||||
setup() {
|
||||
let filter:any = reactive({
|
||||
dataList:[],
|
||||
tableLoading:false,
|
||||
})
|
||||
let filterData:any = reactive({
|
||||
rangePickerValue:[],
|
||||
currentPage: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
userType:'',
|
||||
})
|
||||
let state:any = ref([
|
||||
{
|
||||
label:'all',
|
||||
value:'',
|
||||
},
|
||||
{
|
||||
label:'visitor',
|
||||
value:'0',
|
||||
},
|
||||
{
|
||||
label:'yearly',
|
||||
value:'1',
|
||||
},
|
||||
{
|
||||
label:'monthly',
|
||||
value:'2',
|
||||
},
|
||||
{
|
||||
label:'trial',
|
||||
value:'3',
|
||||
},
|
||||
])
|
||||
let renameData: any = ref({}); //修改名字选中的数据
|
||||
const columns: any = computed(() => {
|
||||
return [
|
||||
{
|
||||
title: 'User Id',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
dataIndex: "id",
|
||||
key: "id",
|
||||
fixed: 'left'
|
||||
},
|
||||
{
|
||||
title: 'Email',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
dataIndex: "userEmail",
|
||||
key: "userEmail",
|
||||
},
|
||||
{
|
||||
title: 'User Name',
|
||||
align: "center",
|
||||
ellipsis: 200,
|
||||
dataIndex: "userName",
|
||||
key: "userName",
|
||||
// customRender: (record: any) => {
|
||||
// let time = formatTime(
|
||||
// record.text / 1000,
|
||||
// "YYYY-MM-DD hh:mm:ss"
|
||||
// );
|
||||
// return time;
|
||||
// },
|
||||
},
|
||||
{
|
||||
title: 'language',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
dataIndex: "language",
|
||||
key: "language",
|
||||
},
|
||||
{
|
||||
title: 'Valid Start Time',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
dataIndex: "validstartTime",
|
||||
key: "validstartTime",
|
||||
},
|
||||
{
|
||||
title: 'Valid End Time',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
dataIndex: "validendTime",
|
||||
key: "validendTime",
|
||||
},
|
||||
{
|
||||
title: 'Country',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
dataIndex: "country",
|
||||
key: "country",
|
||||
},
|
||||
{
|
||||
title: 'Create Date',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
dataIndex: "createDate",
|
||||
key: "createDate",
|
||||
},
|
||||
{
|
||||
title: 'Is Beginner',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
dataIndex: "isBeginner",
|
||||
key: "isBeginner",
|
||||
customRender: (record: any) => {
|
||||
let str
|
||||
if(record.value == 1){
|
||||
str ='Yes'
|
||||
}else{
|
||||
str ='No'
|
||||
}
|
||||
return str;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: 'Machine Room Ip',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
dataIndex: "browserIdentifiers",
|
||||
key: "browserIdentifiers",
|
||||
},
|
||||
{
|
||||
title: 'Credits',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
// width: 150,
|
||||
// minWidth: 100,
|
||||
// maxWidth: 200,
|
||||
// resizable: true,
|
||||
dataIndex: "credits",
|
||||
key: "credits",
|
||||
},
|
||||
{
|
||||
title: 'User Type',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
// width: 150,
|
||||
// minWidth: 100,
|
||||
// maxWidth: 200,
|
||||
// resizable: true,
|
||||
dataIndex: "systemUser",
|
||||
key: "systemUser",
|
||||
customRender: (record: any) => {
|
||||
let str
|
||||
if(record.value == 0){
|
||||
str ='visitor'
|
||||
}else if(record.value == 1){
|
||||
str ='yearly'
|
||||
}else if(record.value == 2){
|
||||
str ='monthly'
|
||||
}else if(record.value == 3){
|
||||
str ='trial'
|
||||
}else if(record.value == 4){
|
||||
str ='userInEvent'
|
||||
}
|
||||
return str;
|
||||
},
|
||||
},
|
||||
|
||||
];
|
||||
});
|
||||
//改变页码
|
||||
let changePage = (e: any) => {
|
||||
filterData.currentPage = e.current;
|
||||
filterData.pageSize = e.pageSize;
|
||||
// gettrialList();
|
||||
}
|
||||
|
||||
//查询列表
|
||||
let searchHistoryList = ()=> {
|
||||
filterData.currentPage = 1;
|
||||
gettrialList();
|
||||
}
|
||||
|
||||
//获取列表
|
||||
let gettrialList = () =>{
|
||||
filter.tableLoading = true
|
||||
let startDate: any = filterData.rangePickerValue?.[0]
|
||||
? filterData.rangePickerValue[0]+' '+'00:00:00'
|
||||
: "";
|
||||
let endDate: any = filterData.rangePickerValue?.[1]
|
||||
? filterData.rangePickerValue[1]+' '+'00:00:00'
|
||||
: "";
|
||||
let data = {
|
||||
endTime:endDate,
|
||||
startTime:startDate,
|
||||
size:filterData.pageSize,
|
||||
page:filterData.currentPage,
|
||||
userType:filterData.userType,
|
||||
}
|
||||
Https.axiosGet(Https.httpUrls.recentNewUser,{params:data}).then((rv: any) => {
|
||||
if (rv) {
|
||||
// this.dataList = rv
|
||||
filter.dataList = rv.records
|
||||
filterData.total = rv.total
|
||||
filter.tableLoading = false
|
||||
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
})
|
||||
}
|
||||
let lastGeTrialList = (str:string)=>{
|
||||
let currentDate = new Date();
|
||||
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
|
||||
// 计算30天前的时间戳
|
||||
let thirtyDaysAgoTimestamp
|
||||
if(str == 'year'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (360 * 24 * 60 * 60);
|
||||
}else if(str == 'month'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (30 * 24 * 60 * 60);
|
||||
}else if(str == 'week'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (7 * 24 * 60 * 60);
|
||||
}
|
||||
filterData.rangePickerValue = [formatTime(thirtyDaysAgoTimestamp,'YYYY-MM-DD'),formatTime(currentTimestamp,'YYYY-MM-DD')]
|
||||
gettrialList();
|
||||
}
|
||||
onMounted(()=>{
|
||||
lastGeTrialList('month')
|
||||
})
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
state,
|
||||
columns,
|
||||
renameData,
|
||||
changePage,
|
||||
searchHistoryList,
|
||||
lastGeTrialList,
|
||||
gettrialList,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
historyTableHeight: 0,
|
||||
handleResizeColumn: (w:any, col:any) => {
|
||||
col.width = w;
|
||||
},
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
let historyTable: any = this.$refs.historyTable;
|
||||
this.historyTableHeight = historyTable.clientHeight - 200;
|
||||
},
|
||||
methods: {
|
||||
|
||||
},
|
||||
});
|
||||
</script>
|
||||
223
src/component/Administrator/recentNewUserChart.vue
Normal file
223
src/component/Administrator/recentNewUserChart.vue
Normal file
@@ -0,0 +1,223 @@
|
||||
<template>
|
||||
<div class="recentNewUserChart admin_page">
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
|
||||
<div class="admin_state_item">
|
||||
<span>State Time:</span>
|
||||
<a-range-picker
|
||||
style="width:280px"
|
||||
class="range_picker"
|
||||
v-model:value="rangePickerValue"
|
||||
:allowClear="false"
|
||||
:placeholder="[
|
||||
$t('HistoryPage.StartDate'),
|
||||
$t('HistoryPage.EndDate'),
|
||||
]"
|
||||
valueFormat="YYYY-MM-DD"
|
||||
>
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
</template>
|
||||
</a-range-picker>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>Type:</span>
|
||||
<a-select v-model:value="userType" size="large" style="width:280px" optionFilterProp="label" :options="state" placeholder="Please select" allowClear show-search></a-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
<div class="admin_search_item" @click="searchHistoryList">Search</div>
|
||||
</div>
|
||||
<div class="admin_state_list">
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('year')">Last year</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('month')">Last month</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('week')">Last week</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="admin_table_content" ref="pageChartDom">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounted } from "vue";
|
||||
import { Https } from "@/tool/https";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import * as echarts from 'echarts/core';
|
||||
import { TooltipComponent, LegendComponent } from 'echarts/components';
|
||||
import { PieChart } from 'echarts/charts';
|
||||
import { LabelLayout } from 'echarts/features';
|
||||
import { CanvasRenderer } from 'echarts/renderers';
|
||||
export default defineComponent({
|
||||
components: {
|
||||
},
|
||||
setup() {
|
||||
let filter:any = reactive({
|
||||
dataList:{},
|
||||
})
|
||||
|
||||
let filterData:any = reactive({
|
||||
rangePickerValue:[],
|
||||
userType:''
|
||||
})
|
||||
let state:any = ref([
|
||||
{
|
||||
label:'all',
|
||||
value:'',
|
||||
},
|
||||
{
|
||||
label:'visitor',
|
||||
value:'0',
|
||||
},
|
||||
{
|
||||
label:'yearly',
|
||||
value:'1',
|
||||
},
|
||||
{
|
||||
label:'monthly',
|
||||
value:'2',
|
||||
},
|
||||
{
|
||||
label:'trial',
|
||||
value:'3',
|
||||
},
|
||||
])
|
||||
//查询列表
|
||||
let searchHistoryList = ()=> {
|
||||
gettrialList();
|
||||
}
|
||||
//获取列表
|
||||
let gettrialList = async () =>{
|
||||
filter.tableLoading = true
|
||||
let startDate: any = filterData.rangePickerValue?.[0]
|
||||
? filterData.rangePickerValue[0]+' '+'00:00:00'
|
||||
: "";
|
||||
let endDate: any = filterData.rangePickerValue?.[1]
|
||||
? filterData.rangePickerValue[1]+' '+'00:00:00'
|
||||
: "";
|
||||
let data = {
|
||||
endTime:endDate,
|
||||
startTime:startDate,
|
||||
userType:filterData.userType
|
||||
}
|
||||
Https.axiosGet(Https.httpUrls.recentNewUserChart,{params:data}).then((rv: any) => {
|
||||
if (rv) {
|
||||
let data:any = []
|
||||
rv.names.forEach((item:any,index:number) => {
|
||||
let obj = {
|
||||
name : item,
|
||||
value:rv.values[index],
|
||||
}
|
||||
data.push(obj)
|
||||
});
|
||||
filter.dataList = data
|
||||
setEcharts(data)
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
let myChart:any
|
||||
let setEcharts = (data:any) =>{
|
||||
if (myChart) {
|
||||
myChart.setOption({
|
||||
series: [{
|
||||
data: data
|
||||
}]
|
||||
});
|
||||
}else{
|
||||
echarts.use([
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
PieChart,
|
||||
CanvasRenderer,
|
||||
LabelLayout
|
||||
]);
|
||||
var chartDom = pageChartDom.value;
|
||||
myChart = echarts.init(chartDom);
|
||||
var option;
|
||||
|
||||
option = {
|
||||
tooltip: {
|
||||
trigger: 'item'
|
||||
},
|
||||
legend: {
|
||||
top: '5%',
|
||||
left: 'center',
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'pie',
|
||||
radius: ['40%', '70%'],
|
||||
avoidLabelOverlap: false,
|
||||
|
||||
itemStyle: {
|
||||
borderRadius: 10
|
||||
},
|
||||
label: {
|
||||
show: false,
|
||||
position: 'center'
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: 30,
|
||||
fontWeight: 'bold'
|
||||
}
|
||||
},
|
||||
labelLine: {
|
||||
show: false
|
||||
},
|
||||
stillShowZeroSum:true,
|
||||
data: data
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
option && myChart.setOption(option);
|
||||
}
|
||||
|
||||
}
|
||||
let lastGeTrialList = (str:string)=>{
|
||||
let currentDate = new Date();
|
||||
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
|
||||
// 计算30天前的时间戳
|
||||
let thirtyDaysAgoTimestamp
|
||||
if(str == 'year'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (360 * 24 * 60 * 60);
|
||||
}else if(str == 'month'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (30 * 24 * 60 * 60);
|
||||
}else if(str == 'week'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (7 * 24 * 60 * 60);
|
||||
}
|
||||
filterData.rangePickerValue = [formatTime(thirtyDaysAgoTimestamp,'YYYY-MM-DD'),formatTime(currentTimestamp,'YYYY-MM-DD')]
|
||||
gettrialList();
|
||||
}
|
||||
let pageChartDom:any = ref()
|
||||
onMounted(()=>{
|
||||
lastGeTrialList('month')
|
||||
})
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
state,
|
||||
searchHistoryList,
|
||||
gettrialList,
|
||||
pageChartDom,
|
||||
lastGeTrialList,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
|
||||
},
|
||||
});
|
||||
</script>
|
||||
310
src/component/Administrator/trialAllUser.vue
Normal file
310
src/component/Administrator/trialAllUser.vue
Normal file
@@ -0,0 +1,310 @@
|
||||
<template>
|
||||
<div class="admin_page">
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
|
||||
<div class="admin_state_item">
|
||||
<span>Select Time:</span>
|
||||
<a-range-picker
|
||||
style="width:250px"
|
||||
class="range_picker"
|
||||
v-model:value="rangePickerValue"
|
||||
:placeholder="[
|
||||
$t('HistoryPage.StartDate'),
|
||||
$t('HistoryPage.EndDate'),
|
||||
]"
|
||||
valueFormat="YYYY-MM-DD"
|
||||
>
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
</template>
|
||||
</a-range-picker>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>Country:</span>
|
||||
<a-select
|
||||
v-model:value="country"
|
||||
:allowClear="true"
|
||||
show-search
|
||||
style="width: 250px"
|
||||
:filter-option="filterOption"
|
||||
placeholder="Select Item..."
|
||||
max-tag-count="responsive"
|
||||
:options="allCountry"
|
||||
></a-select>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>Email:</span>
|
||||
<input
|
||||
v-model="email"
|
||||
placeholder="Please enter email"
|
||||
@keydown.enter="gettrialList"
|
||||
type="text"
|
||||
style="width: 250px"
|
||||
/>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>User Name:</span>
|
||||
<a-select
|
||||
v-model:value="ids"
|
||||
mode="multiple"
|
||||
style="width: 250px"
|
||||
:filter-option="filterOption"
|
||||
placeholder="Select Item..."
|
||||
max-tag-count="responsive"
|
||||
:options="allUserList"
|
||||
@keydown.enter="gettrialList"
|
||||
></a-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
<div class="admin_search_item" @click="searchHistoryList">Search</div>
|
||||
</div>
|
||||
<div class="admin_state_list">
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('year')">Last year</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('month')">Last month</div>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('week')">Last week</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="admin_table_content" ref="historyTable">
|
||||
<a-table
|
||||
@resizeColumn="handleResizeColumn"
|
||||
:loading="tableLoading"
|
||||
:columns="columns"
|
||||
:data-source="dataList"
|
||||
:scroll="{ y: historyTableHeight }"
|
||||
@change="changePage"
|
||||
:showSorterTooltip='false'
|
||||
:pagination="{
|
||||
showSizeChanger: true,
|
||||
current: currentPage,
|
||||
pageSize: pageSize,
|
||||
total: total,
|
||||
showQuickJumper: true,
|
||||
bordered: false,
|
||||
}"
|
||||
>
|
||||
</a-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounted } from "vue";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import { Https } from "@/tool/https";
|
||||
export default defineComponent({
|
||||
components: {
|
||||
},
|
||||
setup() {
|
||||
let filter:any = reactive({
|
||||
dataList:[],
|
||||
tableLoading:false,
|
||||
allUserList: [],
|
||||
allCountry:[]
|
||||
})
|
||||
let filterData:any = reactive({
|
||||
rangePickerValue:[],
|
||||
currentPage: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
country: "",
|
||||
email: "",
|
||||
userType: "",
|
||||
ids: [],
|
||||
occupation: "",
|
||||
order: "", //'Ascending 升序 Descending 降序'
|
||||
orderBy:'',
|
||||
userName: "",
|
||||
})
|
||||
|
||||
let renameData: any = ref({}); //修改名字选中的数据
|
||||
const columns: any = computed(() => {
|
||||
return [
|
||||
|
||||
{
|
||||
title: 'User Id',
|
||||
align: "center",
|
||||
width: 100,
|
||||
fixed: "left",
|
||||
sorter: true,
|
||||
dataIndex: "id",
|
||||
key: "id",
|
||||
},
|
||||
{
|
||||
title: 'User Name',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
width: 150,
|
||||
dataIndex: "userName",
|
||||
key: "userName",
|
||||
},
|
||||
{
|
||||
title: 'Email',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
width: 200,
|
||||
dataIndex: "email",
|
||||
key: "email",
|
||||
},
|
||||
{
|
||||
title: 'Given Name',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
width: 100,
|
||||
dataIndex: "givenName",
|
||||
key: "givenName",
|
||||
},
|
||||
{
|
||||
title: 'Create Date',
|
||||
align: "center",
|
||||
width: 200,
|
||||
ellipsis:true,
|
||||
dataIndex: "createTime",
|
||||
key: "createTime",
|
||||
sorter: true,
|
||||
},
|
||||
{
|
||||
title: 'Title',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
width: 100,
|
||||
//
|
||||
dataIndex: "title",
|
||||
key: "title",
|
||||
},
|
||||
{
|
||||
title: 'Country',
|
||||
align: "center",
|
||||
width: 100,
|
||||
ellipsis: true,
|
||||
dataIndex: "country",
|
||||
key: "country",
|
||||
},
|
||||
|
||||
];
|
||||
});
|
||||
//改变页码
|
||||
let changePage = (e: any, filters:any, sorter:any) => {
|
||||
filterData.currentPage = e.current;
|
||||
filterData.pageSize = e.pageSize;
|
||||
if(sorter.order){
|
||||
if(sorter.columnKey == 'id'){
|
||||
filterData.orderBy = 'id'
|
||||
}else if(sorter.columnKey == "createDate"){
|
||||
filterData.orderBy = 'time'
|
||||
}
|
||||
}
|
||||
filterData.order = sorter.order == "descend" ? "Descending" : "Ascending";
|
||||
gettrialList();
|
||||
}
|
||||
|
||||
//查询列表
|
||||
let searchHistoryList = ()=> {
|
||||
filterData.currentPage = 1;
|
||||
gettrialList();
|
||||
}
|
||||
|
||||
//获取列表
|
||||
let gettrialList = () =>{
|
||||
filter.tableLoading = true
|
||||
let startDate: any = filterData.rangePickerValue?.[0]
|
||||
? filterData.rangePickerValue[0]+' '+'00:00:00'
|
||||
: "";
|
||||
let endDate: any = filterData.rangePickerValue?.[1]
|
||||
? filterData.rangePickerValue[1]+' '+'00:00:00'
|
||||
: "";
|
||||
let data = {
|
||||
endTime:endDate,
|
||||
startTime:startDate,
|
||||
size: filterData.pageSize,
|
||||
page: filterData.currentPage,
|
||||
country: filterData.country,
|
||||
email: filterData.email,
|
||||
userType: filterData.userType,
|
||||
ids: filterData.ids,
|
||||
occupation: filterData.occupation,
|
||||
order: filterData.order,
|
||||
orderBy: filterData.orderBy,
|
||||
userName: filterData.userName,
|
||||
}
|
||||
Https.axiosPost(Https.httpUrls.inquiryGetTrial,data).then((rv: any) => {
|
||||
if (rv) {
|
||||
// this.dataList = rv
|
||||
filter.dataList = rv.records
|
||||
filterData.total = rv.total
|
||||
filter.tableLoading = false
|
||||
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
})
|
||||
}
|
||||
let filterOption = (input: any, option: any) => {
|
||||
// 使用 option.label 进行搜索
|
||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
|
||||
};
|
||||
let lastGeTrialList = (str:string)=>{
|
||||
let currentDate = new Date();
|
||||
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
|
||||
// 计算30天前的时间戳
|
||||
let thirtyDaysAgoTimestamp
|
||||
if(str == 'year'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (360 * 24 * 60 * 60);
|
||||
}else if(str == 'month'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (30 * 24 * 60 * 60);
|
||||
}else if(str == 'week'){
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - (7 * 24 * 60 * 60);
|
||||
}
|
||||
filterData.rangePickerValue = [formatTime(thirtyDaysAgoTimestamp,'YYYY-MM-DD'),formatTime(currentTimestamp,'YYYY-MM-DD')]
|
||||
gettrialList();
|
||||
}
|
||||
onMounted(()=>{
|
||||
let allUserList: any = sessionStorage.getItem("allUserList");
|
||||
if (allUserList) {
|
||||
filter.allUserList = JSON.parse(allUserList);
|
||||
}
|
||||
let allCountry: any = sessionStorage.getItem("allCountry");
|
||||
if (allCountry) {
|
||||
filter.allCountry = JSON.parse(allCountry);
|
||||
}
|
||||
lastGeTrialList('month')
|
||||
})
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
columns,
|
||||
renameData,
|
||||
changePage,
|
||||
filterOption,
|
||||
searchHistoryList,
|
||||
lastGeTrialList,
|
||||
gettrialList,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
historyTableHeight: 0,
|
||||
handleResizeColumn: (w:any, col:any) => {
|
||||
col.width = w;
|
||||
},
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
let historyTable: any = this.$refs.historyTable;
|
||||
this.historyTableHeight = historyTable.clientHeight - 200;
|
||||
},
|
||||
methods: {
|
||||
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.admin_page .admin_table_search .admin_state {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
</style>
|
||||
@@ -16,7 +16,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="allUser_table_content" ref="historyTable">
|
||||
<div class="admin_table_content" ref="historyTable">
|
||||
<a-table
|
||||
:columns="columns"
|
||||
:data-source="collectionList"
|
||||
@@ -140,7 +140,7 @@ export default defineComponent({
|
||||
key: "surname",
|
||||
},
|
||||
{
|
||||
title: 'Name',
|
||||
title: 'User Name',
|
||||
align: "center",
|
||||
ellipsis: true,
|
||||
|
||||
@@ -293,6 +293,8 @@ export default defineComponent({
|
||||
},
|
||||
});
|
||||
</script>
|
||||
<style lang="less">
|
||||
|
||||
<style lang="less" scoped>
|
||||
.admin_page .admin_table_content .operate_list{
|
||||
justify-content: space-between;
|
||||
}
|
||||
</style>
|
||||
158
src/component/Administrator/trialUserConversionRateChart.vue
Normal file
158
src/component/Administrator/trialUserConversionRateChart.vue
Normal file
@@ -0,0 +1,158 @@
|
||||
<template>
|
||||
<div class="recentNewUserChart admin_page">
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="admin_table_content" ref="pageChartDom"></div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import {
|
||||
defineComponent,
|
||||
ref,
|
||||
createVNode,
|
||||
computed,
|
||||
reactive,
|
||||
toRefs,
|
||||
onMounted,
|
||||
} from "vue";
|
||||
import { Https } from "@/tool/https";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import * as echarts from "echarts/core";
|
||||
import { TooltipComponent, LegendComponent } from "echarts/components";
|
||||
import { PieChart } from "echarts/charts";
|
||||
import { LabelLayout } from "echarts/features";
|
||||
import { CanvasRenderer } from "echarts/renderers";
|
||||
export default defineComponent({
|
||||
components: {},
|
||||
setup() {
|
||||
let filter: any = reactive({
|
||||
dataList: {},
|
||||
});
|
||||
|
||||
let filterData: any = reactive({
|
||||
rangePickerValue: [],
|
||||
});
|
||||
|
||||
//查询列表
|
||||
let searchHistoryList = () => {
|
||||
gettrialList();
|
||||
};
|
||||
//获取列表
|
||||
let gettrialList = async () => {
|
||||
Https.axiosGet(Https.httpUrls.conversionRate).then((rv: any) => {
|
||||
if (rv) {
|
||||
let entries:any = Object.entries(rv);
|
||||
let data: any = [];
|
||||
for (let [key, value] of entries) {
|
||||
let str
|
||||
console.log(key);
|
||||
|
||||
|
||||
if(key != 'conversionRate'){
|
||||
if(key == 'trialToOfficialCount'){
|
||||
str = 'Trial To Official'
|
||||
}else{
|
||||
str = 'Trial User'
|
||||
}
|
||||
let obj = {
|
||||
name: str,
|
||||
value: value
|
||||
}
|
||||
data.push(obj);
|
||||
}
|
||||
}
|
||||
filter.dataList = data;
|
||||
setEcharts(data);
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
});
|
||||
};
|
||||
let myChart: any;
|
||||
let setEcharts = (data: any) => {
|
||||
if (myChart) {
|
||||
myChart.setOption({
|
||||
series: [
|
||||
{
|
||||
data: data,
|
||||
},
|
||||
],
|
||||
});
|
||||
} else {
|
||||
echarts.use([
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
PieChart,
|
||||
CanvasRenderer,
|
||||
LabelLayout,
|
||||
]);
|
||||
var chartDom = pageChartDom.value;
|
||||
myChart = echarts.init(chartDom);
|
||||
var option;
|
||||
|
||||
option = {
|
||||
tooltip: {
|
||||
trigger: "item",
|
||||
formatter: '{a} <br/>{b} : {c} ({d}%)'
|
||||
},
|
||||
legend: {
|
||||
top: '10%',
|
||||
left: 'center'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name:'Rate',
|
||||
type: 'pie',
|
||||
radius: ['40%', '70%'],
|
||||
avoidLabelOverlap: false,
|
||||
|
||||
itemStyle: {
|
||||
borderRadius: 10
|
||||
},
|
||||
label: {
|
||||
show: false,
|
||||
position: 'center'
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: 30,
|
||||
fontWeight: 'bold'
|
||||
}
|
||||
},
|
||||
labelLine: {
|
||||
show: false
|
||||
},
|
||||
data: data
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
option && myChart.setOption(option);
|
||||
}
|
||||
};
|
||||
|
||||
let pageChartDom: any = ref();
|
||||
onMounted(() => {
|
||||
gettrialList();
|
||||
});
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
searchHistoryList,
|
||||
gettrialList,
|
||||
pageChartDom,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {};
|
||||
},
|
||||
|
||||
methods: {},
|
||||
});
|
||||
</script>
|
||||
152
src/component/Administrator/trialUserCountry.vue
Normal file
152
src/component/Administrator/trialUserCountry.vue
Normal file
@@ -0,0 +1,152 @@
|
||||
<template>
|
||||
<div class="recentNewUserChart admin_page">
|
||||
<div class="admin_table_search">
|
||||
<div class="admin_state">
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="admin_table_content" ref="pageChartDom"></div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import {
|
||||
defineComponent,
|
||||
ref,
|
||||
createVNode,
|
||||
computed,
|
||||
reactive,
|
||||
toRefs,
|
||||
onMounted,
|
||||
} from "vue";
|
||||
import { Https } from "@/tool/https";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import * as echarts from "echarts/core";
|
||||
import { TooltipComponent, LegendComponent } from "echarts/components";
|
||||
import { PieChart } from "echarts/charts";
|
||||
import { LabelLayout } from "echarts/features";
|
||||
import { CanvasRenderer } from "echarts/renderers";
|
||||
export default defineComponent({
|
||||
components: {},
|
||||
setup() {
|
||||
let filter: any = reactive({
|
||||
dataList: {},
|
||||
});
|
||||
|
||||
let filterData: any = reactive({
|
||||
rangePickerValue: [],
|
||||
userType: "",
|
||||
});
|
||||
let state: any = ref([
|
||||
{
|
||||
label: "all",
|
||||
value: "",
|
||||
},
|
||||
{
|
||||
label: "visitor",
|
||||
value: "visitor",
|
||||
},
|
||||
{
|
||||
label: "trial",
|
||||
value: "trial",
|
||||
},
|
||||
{
|
||||
label: "official",
|
||||
value: "official",
|
||||
},
|
||||
]);
|
||||
//查询列表
|
||||
let searchHistoryList = () => {
|
||||
gettrialList();
|
||||
};
|
||||
//获取列表
|
||||
let gettrialList = async () => {
|
||||
Https.axiosGet(Https.httpUrls.trialUserCountry).then((rv: any) => {
|
||||
if (rv) {
|
||||
let data: any = [];
|
||||
rv.names.forEach((item: any, index: number) => {
|
||||
let obj = {
|
||||
name: item,
|
||||
value: rv.values[index],
|
||||
};
|
||||
data.push(obj);
|
||||
});
|
||||
filter.dataList = data;
|
||||
setEcharts(data);
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
});
|
||||
};
|
||||
let myChart: any;
|
||||
let setEcharts = (data: any) => {
|
||||
if (myChart) {
|
||||
myChart.setOption({
|
||||
series: [
|
||||
{
|
||||
data: data,
|
||||
},
|
||||
],
|
||||
});
|
||||
} else {
|
||||
echarts.use([
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
PieChart,
|
||||
CanvasRenderer,
|
||||
LabelLayout,
|
||||
]);
|
||||
var chartDom = pageChartDom.value;
|
||||
myChart = echarts.init(chartDom);
|
||||
var option;
|
||||
|
||||
option = {
|
||||
tooltip: {
|
||||
trigger: "item",
|
||||
},
|
||||
legend: {
|
||||
top: '5%',
|
||||
left: 'center'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: "pie",
|
||||
radius: "55%",
|
||||
center: ["50%", "55%"],
|
||||
data: data,
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
shadowBlur: 10,
|
||||
shadowOffsetX: 0,
|
||||
shadowColor: "rgba(0, 0, 0, 0.5)",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
option && myChart.setOption(option);
|
||||
}
|
||||
};
|
||||
|
||||
let pageChartDom: any = ref();
|
||||
onMounted(() => {
|
||||
gettrialList();
|
||||
});
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
state,
|
||||
searchHistoryList,
|
||||
gettrialList,
|
||||
pageChartDom,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {};
|
||||
},
|
||||
|
||||
methods: {},
|
||||
});
|
||||
</script>
|
||||
@@ -813,6 +813,7 @@ export default defineComponent({
|
||||
// this.store.commit("setTemplateData", event);
|
||||
// },
|
||||
async setWorkspaceStyle(data: any){
|
||||
|
||||
// this.workspaceItem.styleId = data.id
|
||||
this.workspaceItem.styleName = data.name
|
||||
this.workspaceItem.style = data.value
|
||||
@@ -820,6 +821,9 @@ export default defineComponent({
|
||||
if(data.isRevampModel){
|
||||
await this.getMannequins(true)
|
||||
}
|
||||
if(!this.workspaceItem.overallSingle){
|
||||
this.workspaceItem.position = 'Overall'
|
||||
}
|
||||
this.putWorkspace(this.workspaceItem,this.workspaceItem.id)
|
||||
},
|
||||
setStyle(){
|
||||
|
||||
Reference in New Issue
Block a user