调整管理员页面

This commit is contained in:
X1627315083
2024-08-05 16:15:43 +08:00
parent ce7892e574
commit 12ea743827
22 changed files with 3762 additions and 337 deletions

View File

@@ -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>

View File

@@ -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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@@ -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>

View 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>

View 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>

View File

@@ -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(){