Files
aida_front/src/component/Administrator/allUser.vue

586 lines
15 KiB
Vue
Raw Normal View History

2024-03-08 16:51:24 +08:00
<template>
2026-04-28 14:25:17 +08:00
<div class="admin_page">
<div class="admin_table_search" :style="{ height: isAwayOrUnfold ? '7rem' : '' }">
<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">
2024-08-05 16:15:43 +08:00
<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> -->
2026-04-28 14:25:17 +08:00
<div class="admin_state_item">
<span>Country or Region:</span>
2024-08-05 16:15:43 +08:00
<a-select
2026-04-28 14:25:17 +08:00
v-model:value="country"
2024-08-05 16:15:43 +08:00
:allowClear="true"
show-search
2026-04-28 14:25:17 +08:00
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
2024-08-05 16:15:43 +08:00
v-model="email"
placeholder="Please enter email"
@keydown.enter="gettrialList"
type="text"
style="width: 250px"
/> -->
2026-04-28 14:25:17 +08:00
<SelectUser v-model="email" labelKey="email" valueKey="email" />
</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 class="admin_state_item">
<span>Orgnization:</span>
<a-select
v-model:value="organizationId"
placeholder="Select the organization"
allow-clear
style="width: 250px"
@popupScroll="handleOrganizationScroll"
>
<a-select-option
v-for="item in organizationOptions"
:key="item.id"
:value="item.id"
>
{{ item.name }}
</a-select-option>
</a-select>
</div>
</div>
<div class="admin_search">
<div
class="admin_search_item"
@click="searchHistoryList"
:style="{ height: isAwayOrUnfold ? '4rem' : '' }"
>
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')">
Nearly a 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="awayOrUnfold" :class="{ active: isAwayOrUnfold }">
<span
class="icon iconfont menu_icon icon-xiala"
@click="() => (isAwayOrUnfold = !isAwayOrUnfold)"
></span>
2025-04-30 14:01:52 +08:00
</div>
2026-04-28 14:25:17 +08:00
<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
2024-08-05 16:15:43 +08:00
class="operate_item"
@click="deleteGroup(record, index)"
>
Delete
</div> -->
2026-04-28 14:25:17 +08:00
</div>
</template>
</a-table>
</div>
<allUserPoerationsVue
ref="allUserPoerationsVue"
@searchHistoryList="searchHistoryList"
/>
</div>
2024-03-08 16:51:24 +08:00
</template>
<script lang="ts">
2026-04-28 14:25:17 +08:00
import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounted } from "vue"
import { formatTime } from "@/tool/util"
import { useStore } from "vuex"
import { Https } from "@/tool/https"
import allUserPoerationsVue from "./allUserPoerations.vue"
import SelectUser from "@/component/common/SelectUser.vue"
2024-03-08 16:51:24 +08:00
export default defineComponent({
2026-04-28 14:25:17 +08:00
components: { allUserPoerationsVue, SelectUser },
setup() {
const store: any = useStore()
let filter: any = reactive({
dataList: [],
tableLoading: false,
allCountry: [],
isAwayOrUnfold: false
})
let filterData: any = reactive({
rangePickerValue: [],
currentPage: 1,
pageSize: 10,
total: 0,
country: "",
email: "",
userType: "",
ids: [],
occupation: "",
systemUser: "",
order: "", //'Ascending 升序 Descending 降序'
orderBy: "",
userName: "",
organizationId: null
})
let state: any = ref([
{
label: "all",
value: ""
2024-08-06 10:05:50 +08:00
},
{
2026-04-28 14:25:17 +08:00
label: "visitor",
value: "0"
2024-08-06 10:05:50 +08:00
},
{
2026-04-28 14:25:17 +08:00
label: "yearly",
value: "1"
2024-08-06 10:05:50 +08:00
},
{
2026-04-28 14:25:17 +08:00
label: "monthly",
value: "2"
2024-08-06 10:05:50 +08:00
},
2025-09-01 14:03:30 +08:00
{
2026-04-28 14:25:17 +08:00
label: "trial",
value: "3"
},
{
label: "userInEvent",
value: "4"
},
{
label: "Edu Admin",
value: "7"
}
])
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,
2024-08-06 11:41:57 +08:00
customRender: (record: any) => {
2026-04-28 14:25:17 +08:00
let time = ""
if (record.text) {
time = formatTime(record.text / 1000, "YYYY-MM-DD hh:mm:ss")
2024-08-06 11:41:57 +08:00
}
return time
2026-04-28 14:25:17 +08:00
}
},
{
title: "Valid End Time",
align: "center",
dataIndex: "validEndTime",
key: "validendTime",
width: 200,
ellipsis: true,
2024-08-06 11:41:57 +08:00
customRender: (record: any) => {
2026-04-28 14:25:17 +08:00
let time = ""
if (record.text) {
time = formatTime(record.text / 1000, "YYYY-MM-DD hh:mm:ss")
2024-08-06 11:41:57 +08:00
}
return time
2026-04-28 14:25:17 +08:00
}
},
{
title: "Country or Region",
align: "center",
dataIndex: "country",
key: "country",
width: 200
},
{
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
},
{
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"
} else if (record.value == 7) {
str = "Edu Admin"
}
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"
2024-08-05 16:15:43 +08:00
}
}
2026-04-28 14:25:17 +08:00
if (sorter.order) {
filterData.order = sorter.order == "descend" ? "Descending" : "Ascending"
} else {
filterData.order = ""
2025-11-03 17:03:26 +08:00
}
2026-04-28 14:25:17 +08:00
gettrialList()
}
2024-08-05 16:15:43 +08:00
2026-04-28 14:25:17 +08:00
//查询列表
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] + " " + "23:59:59"
: ""
let data = {
endTime: endDate,
startTime: startDate,
size: filterData.pageSize,
page: filterData.currentPage,
systemUser: filterData.systemUser,
country: filterData.country,
email: filterData.email?.trim(),
userType: filterData.userType,
ids: filterData.ids,
occupation: filterData.occupation,
order: filterData.order,
orderBy: filterData.orderBy,
userName: filterData.userName,
organizationId: filterData.organizationId
}
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
2024-08-05 16:15:43 +08:00
2026-04-28 14:25:17 +08:00
// 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", "")
}
2024-08-05 16:15:43 +08:00
let allUserPoerationsVue = ref()
2026-04-28 14:25:17 +08:00
let setAagree = (data: any) => {
allUserPoerationsVue.value.init("Edit", data)
2024-08-05 16:15:43 +08:00
}
2026-04-28 14:25:17 +08:00
const organizationOptions = ref([])
const organizationParams = reactive({
page: 1,
size: 10,
total: 0
})
const organizationLoading = ref(false)
const getOrganizationList = async (isLoadMore = false) => {
console.log("111111")
if (organizationLoading.value) return
if (isLoadMore) {
const loaded = organizationParams.page * organizationParams.size
if (organizationParams.total && loaded >= organizationParams.total) return
organizationParams.page += 1
} else {
organizationParams.page = 1
organizationOptions.value = []
}
organizationLoading.value = true
try {
const { total, ...requestParams } = organizationParams
const rv: any = await Https.axiosPost(
Https.httpUrls.queryOrganization,
requestParams
)
if (rv) {
const newRecords = rv.records || []
// 遍历新数据,如果已存在则覆盖,不存在则追加
newRecords.forEach((newOrg: any) => {
const newOrgId = String(newOrg.id)
const existingIndex = organizationOptions.value.findIndex(
(org: any) => String(org.id) === newOrgId
)
if (existingIndex !== -1) {
// 如果已存在,用新数据覆盖旧项
organizationOptions.value[existingIndex] = newOrg
} else {
// 如果不存在,追加到末尾
organizationOptions.value.push(newOrg)
}
})
organizationParams.total = rv.total || 0
}
} finally {
organizationLoading.value = false
}
}
const handleOrganizationScroll = (e: any) => {
const target = e?.target
if (!target) return
const nearBottom = target.scrollTop + target.clientHeight >= target.scrollHeight - 20
if (nearBottom) {
getOrganizationList(true)
}
}
onMounted(() => {
let allCountry: any = sessionStorage.getItem("allCountry")
if (allCountry) {
filter.allCountry = JSON.parse(allCountry)
}
gettrialList()
getOrganizationList()
})
return {
...toRefs(filter),
...toRefs(filterData),
state,
columns,
renameData,
changePage,
searchHistoryList,
addhHistoryList,
lastGeTrialList,
gettrialList,
filterOption,
2024-08-05 16:15:43 +08:00
allUserPoerationsVue,
setAagree,
2026-04-28 14:25:17 +08:00
handleOrganizationScroll,
getOrganizationList,
organizationOptions,
organizationParams
}
},
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: {}
})
2024-03-08 16:51:24 +08:00
</script>
2024-08-05 16:15:43 +08:00
<style lang="less" scoped>
.admin_page .admin_table_search .admin_state {
2026-04-28 14:25:17 +08:00
display: flex;
flex-wrap: wrap;
2025-04-30 14:01:52 +08:00
}
2026-04-28 14:25:17 +08:00
.admin_page {
2024-03-08 16:51:24 +08:00
}
2026-04-28 14:25:17 +08:00
</style>