feat:后台功能

This commit is contained in:
dzc committed 2025-12-05 13:39:53 +08:00
1 parent 5daecfe0d9
commit 23f7f8ecf1
7 files changed
+294 -19

No files matched your search

+46
View File
@@ -0,0 +1,46 @@
import request from '@/config/axios'
// 用户查看记录 VO
export interface ViewRecordVO {
id: number // 收件地址编号
memberId: number // 用户编号
bizType: string // 查询分类、查看朋友圈
bizId: number // 查询分类、查看朋友圈
title: string // 查看的标题
viewStartTime: Date // 开始查看时间
viewEndTime: Date // 结束查看时间
viewSecond: number // 查看时间(秒)
}
// 用户查看记录 API
export const ViewRecordApi = {
// 查询用户查看记录分页
getViewRecordPage: async (params: any) => {
return await request.get({ url: `/member/view-record/page`, params })
},
// 查询用户查看记录详情
getViewRecord: async (id: number) => {
return await request.get({ url: `/member/view-record/get?id=` + id })
},
// 新增用户查看记录
createViewRecord: async (data: ViewRecordVO) => {
return await request.post({ url: `/member/view-record/create`, data })
},
// 修改用户查看记录
updateViewRecord: async (data: ViewRecordVO) => {
return await request.put({ url: `/member/view-record/update`, data })
},
// 删除用户查看记录
deleteViewRecord: async (id: number) => {
return await request.delete({ url: `/member/view-record/delete?id=` + id })
},
// 导出用户查看记录 Excel
exportViewRecord: async (params) => {
return await request.download({ url: `/member/view-record/export-excel`, params })
}
}
+50 -3
View File
@@ -28,7 +28,7 @@
<el-table-column label="操作人" align="center" prop="operatorMemberNickname" width="200px" />
<el-table-column label="描述" align="center">
<template #default="{ row }">
<div>
<div v-if="type === 'recent'">
<span class="color-blue">{{ row.operatorMemberNickname }}</span>
<span>在</span>
<span class="color-red">{{ formatPast(row.createTime) }}</span>
@@ -36,6 +36,12 @@
<span class="color-blue">{{ row.memberNickname }}</span>
<span>的动态</span>
</div>
<div v-if="type === 'user'">
<span class="color-blue">{{ row.operatorMemberNickname }}</span>
<span>在</span>
<span class="color-red">{{ formatPast(row.createTime) }}</span>
<span>收藏/喜欢了你</span>
</div>
</template>
</el-table-column>
<el-table-column label="操作时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
@@ -52,6 +58,23 @@ import { FormInstance } from 'element-plus'
import { dateFormatter, formatPast } from '@/utils/formatTime'
import * as operationApi from "@/api/member/operation"
import { strict } from 'assert'
const props = defineProps({
memberRecentId: {
type: [String, Number],
default: ""
},
memberId: {
type: [String, Number],
default: ""
},
// 操作类型 user 用户,recent动态
type: {
type: String,
default: "recent"
},
})
const queryFormRef = ref<FormInstance>()
@@ -61,13 +84,28 @@ const list = ref([])
// 表单搜索
const queryParams = ref({
bizType: "1",
operatorMemberNickname: "",
memberId: props.memberId,
memberRecentId: props.memberRecentId,
createTime: [],
pageNo: 1,
pageSize: 10,
})
watch(() => props.memberId, (newVal) => {
if (newVal) {
queryParams.value.memberId = newVal as any
getList()
}
})
watch(() => props.memberRecentId, (newVal) => {
if (newVal) {
queryParams.value.memberRecentId = newVal as any
getList()
}
})
/** 搜索按钮操作 */
const handleQuery = async () => {
queryParams.value.pageNo = 1
@@ -84,7 +122,16 @@ const resetQuery = () => {
const getList = async () => {
loading.value = true
try {
const data = await operationApi.OperationApi.getOperationPage(queryParams.value)
const _params: any = {
...queryParams.value
}
if (props.type == "user") {
_params.bizType = 4
}
if (props.type == "recent") {
_params.bizType = 1
}
const data = await operationApi.OperationApi.getOperationPage(_params)
list.value = data.list
total.value = data.total
} finally {
+18 -1
View File
@@ -55,6 +55,14 @@ import { dateFormatter, formatPast } from '@/utils/formatTime'
import * as operationApi from "@/api/member/operation"
const props = defineProps({
memberId: {
type: String,
default: () => { }
},
})
const queryFormRef = ref<FormInstance>()
const total = ref(0)
@@ -63,13 +71,22 @@ const list = ref([])
// 表单搜索
const queryParams = ref({
bizType: "2",
bizType: "6",
memberId: "",
operatorMemberNickname: "",
createTime: [],
pageNo: 1,
pageSize: 10,
})
watch(() => props.memberId, (newVal) => {
if (newVal) {
queryParams.value.memberId = newVal as any
getList()
}
})
/** 搜索按钮操作 */
const handleQuery = async () => {
queryParams.value.pageNo = 1
+16 -1
View File
@@ -53,6 +53,13 @@ import { dateFormatter, formatPast } from '@/utils/formatTime'
import * as operationApi from "@/api/member/operation"
const props = defineProps({
memberId: {
type: [String, Number],
default: ""
},
})
const queryFormRef = ref<FormInstance>()
const total = ref(0)
@@ -61,13 +68,21 @@ const list = ref([])
// 表单搜索
const queryParams = ref({
bizType: "3",
bizType: "5",
operatorMemberId: props.memberId,
operatorMemberNickname: "",
createTime: [],
pageNo: 1,
pageSize: 10,
})
watch(() => props.memberId, (newVal) => {
if (newVal) {
queryParams.value.operatorMemberId = newVal as any
getList()
}
})
/** 搜索按钮操作 */
const handleQuery = async () => {
queryParams.value.pageNo = 1
+128
View File
@@ -0,0 +1,128 @@
<!-- 访问记录 -->
<template>
<ContentWrap>
<el-form ref="queryFormRef" :inline="true" :model="queryParams" class="-mb-15px" label-width="68px">
<el-form-item>
<el-form-item label="操作时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-440px" />
</el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<ContentWrap class="min-h-[500px]">
<el-table v-loading="loading" :data="list" row-key="id">
<el-table-column label="操作人" align="center" width="200px">
<template #default="{ row }">
<span class="color-blue">{{ row.member.memberNickname }}</span>
</template>
</el-table-column>
<el-table-column label="描述" align="center">
<template #default="{ row }">
<div>
<span class="color-blue">{{ row.member.memberNickname }}</span>
<span>在</span>
<span class="color-red">{{ formatPast(row.viewStartTime) }}</span>
<span>访问了</span>
<span class="color-blue">{{ row.memberNickname }}</span>
<span>的动态</span>
<span>,持续时间:{{ row.viewSecond }}秒</span>
</div>
</template>
</el-table-column>
<el-table-column label="操作时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
</el-table>
</ContentWrap>
<Pagination v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNo" :total="total"
@pagination="getList" />
</template>
<script lang="ts" setup>
import { FormInstance } from 'element-plus'
import { dateFormatter, formatPast } from '@/utils/formatTime'
import * as viewrecordApi from "@/api/member/viewrecord"
import { strict } from 'assert'
const props = defineProps({
memberId: {
type: String,
default: () => { }
},
// 操作类型 user 用户,recent动态
type: {
type: String,
default: "recent"
},
})
const queryFormRef = ref<FormInstance>()
const total = ref(0)
const loading = ref(true)
const list = ref([])
// 表单搜索
const queryParams = ref({
bizType: "",
bizId: props.memberId,
createTime: [],
pageNo: 1,
pageSize: 10,
})
watch(() => props.memberId, (newVal) => {
if (newVal) {
queryParams.value.bizId = newVal
getList()
}
})
/** 搜索按钮操作 */
const handleQuery = async () => {
queryParams.value.pageNo = 1
await getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields()
handleQuery()
}
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const _params: any = {
...queryParams.value
}
if (props.type == "user") {
_params.bizType = 3
}
if (props.type == "recent") {
_params.bizType = 2
}
const data = await viewrecordApi.ViewRecordApi.getViewRecordPage(_params)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
onMounted(() => {
getList()
})
</script>
@@ -29,16 +29,18 @@
</template>
<el-tabs>
<el-tab-pane label="点赞记录">
<LikePage />
<LikePage :memberRecentId="recent.id" />
</el-tab-pane>
<el-tab-pane label="举报记录">
<el-tab-pane v-if="false" label="举报记录">
<ReportPage />
</el-tab-pane>
<el-tab-pane label="黑名单记录">
<el-tab-pane v-if="false" label="黑名单记录">
<ShieldPage />
</el-tab-pane>
<el-tab-pane label="查看微信记录" />
<el-tab-pane label="访问记录" />
<el-tab-pane v-if="false" label="查看微信记录" />
<el-tab-pane label="访问记录">
<VisitPage :memberId="recent.memberId" />
</el-tab-pane>
</el-tabs>
</el-card>
<!-- 表单弹窗:添加/修改 -->
@@ -53,6 +55,7 @@ import RecentCard from '@/views/member/recent/cmp/recent-card.vue'
import LikePage from "@/views/member/recent/cmp/like-page.vue"
import ReportPage from "@/views/member/recent/cmp/report-page.vue"
import ShieldPage from "@/views/member/recent/cmp/shield-page.vue"
import VisitPage from "@/views/member/recent/cmp/visit-page.vue"
import { useTagsViewStore } from '@/store/modules/tagsView'
+28 -9
View File
@@ -30,31 +30,45 @@
<CardTitle title="账户明细" />
</template>
<el-tabs>
<el-tab-pane label="积分">
<el-tab-pane label="喜欢我">
<LikePage type="user" :memberId="id" />
</el-tab-pane>
<el-tab-pane label="举报记录">
<ReportPage :memberId="id" />
</el-tab-pane>
<el-tab-pane label="黑名单">
<ShieldPage :memberId="id" />
</el-tab-pane>
<el-tab-pane v-if="false" label="查看微信记录" />
<el-tab-pane label="访问记录">
<VisitPage type="user" :memberId="id" />
</el-tab-pane>
<el-tab-pane v-if="false" label="积分">
<UserPointList :user-id="id" />
</el-tab-pane>
<el-tab-pane label="签到" lazy>
<el-tab-pane v-if="false" label="签到" lazy>
<UserSignList :user-id="id" />
</el-tab-pane>
<el-tab-pane label="成长值" lazy>
<el-tab-pane v-if="false" label="成长值" lazy>
<UserExperienceRecordList :user-id="id" />
</el-tab-pane>
<el-tab-pane label="余额" lazy>
<el-tab-pane label="砖石" lazy>
<UserBalanceList :wallet-id="wallet.id" />
</el-tab-pane>
<el-tab-pane label="收货地址" lazy>
<el-tab-pane v-if="false" label="收货地址" lazy>
<UserAddressList :user-id="id" />
</el-tab-pane>
<el-tab-pane label="订单管理" lazy>
<el-tab-pane v-if="false" label="订单管理" lazy>
<UserOrderList :user-id="id" />
</el-tab-pane>
<el-tab-pane label="售后管理" lazy>
<el-tab-pane v-if="false" label="售后管理" lazy>
<UserAfterSaleList :user-id="id" />
</el-tab-pane>
<el-tab-pane label="收藏记录" lazy>
<el-tab-pane v-if="false" label="收藏记录" lazy>
<UserFavoriteList :user-id="id" />
</el-tab-pane>
<el-tab-pane label="优惠劵" lazy>
<el-tab-pane v-if="false" label="优惠劵" lazy>
<UserCouponList :user-id="id" />
</el-tab-pane>
<el-tab-pane label="推广用户" lazy>
@@ -88,6 +102,11 @@ import UserBalanceList from './UserBalanceList.vue'
import { CardTitle } from '@/components/Card/index'
import { ElMessage } from 'element-plus'
import LikePage from "@/views/member/recent/cmp/like-page.vue"
import ReportPage from "@/views/member/recent/cmp/report-page.vue"
import ShieldPage from "@/views/member/recent/cmp/shield-page.vue"
import VisitPage from "@/views/member/recent/cmp/visit-page.vue"
defineOptions({ name: 'MemberDetail' })
const loading = ref(true) // 加载中