Selaa lähdekoodia

用户列表详情

Hwf 2 viikkoa sitten
vanhempi
commit
be1e259f99

+ 49 - 0
src/assets/styles/index.scss

@@ -385,3 +385,52 @@ aside {
 .image-table .el-table__cell {
   position: static !important;
 }
+
+.common-info-box {
+  width: 100%;
+  background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.72) 5%, rgba(220, 239, 255, 0.15) 100%);
+  box-shadow: 0 2px 1px 0 rgba(24, 144, 255, 0.14);
+  border-top: 1px solid #ebf4ff;
+  //filter: blur(20px);
+  padding: 6px 0 13px;
+  margin-top: 24px;
+  .common-info-header {
+    display: flex;
+    align-items: center;
+    .line-icon {
+      display: inline-block;
+      width: 6px;
+      height: 17px;
+      background-image: linear-gradient(180deg, #00FCE7 0%, #2C81FF 100%);
+      border-radius: 0 3px 0 0;
+      margin-right: 9px;
+    }
+    .common-info-title {
+      font-weight: bold;
+    }
+  }
+  .common-info-content {
+    padding: 0 8px;
+    display: flex;
+    flex-wrap: wrap;
+    width: 100%;
+    margin-top: 8px;
+    .common-info-item {
+      display: flex;
+      align-items: center;
+      margin-top: 9px;
+      &:nth-child(4n + 1) {
+        width: 31%;
+      }
+      &:nth-child(4n + 2) {
+        width: 23%;
+      }
+      &:nth-child(4n + 3) {
+        width: 23%;
+      }
+      &:nth-child(4n + 4) {
+        width: 23%;
+      }
+    }
+  }
+}

+ 0 - 5
src/router/index.js

@@ -62,11 +62,6 @@ export const constantRoutes = [
         component: () => import('@/views/index.vue'),
         name: 'Index',
         meta: { title: '首页', icon: 'sy', affix: true }
-      },
-      {
-        path: '/loginInfo',
-        component: () => import('@/views/monitor/loginInfo/index.vue'),
-        hidden: true
       }
     ]
   },

+ 21 - 28
src/views/commodityManage/index.vue

@@ -2,32 +2,24 @@
   <div class="app-container">
     <div v-show="!(commodityManageFormState.show || interfaceListData.show)">
       <transition name="fade">
-        <el-form ref="queryFormRef" :model="queryParams">
-          <el-row :gutter="20">
-            <el-col :span="6">
-              <el-form-item label="报告名称:" prop="name">
-                <el-input v-model="queryParams.name" placeholder="请输入报告名称" clearable @keyup.enter="handleQuery"/>
-              </el-form-item>
-            </el-col>
-            <el-col :span="6">
-              <el-form-item label="服务分类:" prop="serviceClass">
-                <el-select v-model="queryParams.serviceClass" clearable>
-                  <el-option v-for="item in service_class" :key="item.value" :label="item.label" :value="item.value"></el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="6">
-              <el-form-item label="服务状态:" prop="serviceStatus">
-                <el-select v-model="queryParams.serviceStatus" clearable>
-                  <el-option v-for="item in service_status" :key="item.value" :label="item.label" :value="item.value"></el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="6">
-              <el-button type="primary" @click="handleQuery">搜索</el-button>
-              <el-button @click="resetQuery">重置</el-button>
-            </el-col>
-          </el-row>
+        <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="70px">
+          <el-form-item label="报告名称:" prop="name">
+            <el-input v-model="queryParams.name" placeholder="请输入报告名称" clearable @keyup.enter="handleQuery"/>
+          </el-form-item>
+          <el-form-item label="服务分类:" prop="serviceClass">
+            <el-select v-model="queryParams.serviceClass" clearable>
+              <el-option v-for="item in service_class" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="服务状态:" prop="serviceStatus">
+            <el-select v-model="queryParams.serviceStatus" clearable>
+              <el-option v-for="item in service_status" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="handleQuery">搜索</el-button>
+            <el-button @click="resetQuery">重置</el-button>
+          </el-form-item>
         </el-form>
       </transition>
       <el-row :gutter="10" class="mb8">
@@ -92,8 +84,8 @@ const queryFormRef = ref();
 const queryParams = reactive({
   name: '',
   serviceClass: '',
-  page: '',
-  page_size: ''
+  page: 1,
+  page_size: 10
 });
 // 表格数据
 const dataList = ref([]);
@@ -134,6 +126,7 @@ const resetQuery = () => {
   if (queryFormRef.value) {
     queryFormRef.value.resetFields(); // 重置表单并清除校验状态
   }
+  queryParams.page = 1;
   getList();
 };
 

+ 79 - 0
src/views/userManage/UserDetails.vue

@@ -0,0 +1,79 @@
+<template>
+  <div class="detail-container">
+    <div class="common-back-box" @click="handleBack">
+      <i class="common-back" />
+      返回上一级
+    </div>
+    <div class="common-info-box">
+      <div class="common-info-header">
+        <i class="line-icon" />
+        <div class="common-info-title">基础信息</div>
+      </div>
+      <div class="common-info-content">
+        <div class="common-info-item">用户ID:{{ userInfo.id }}</div>
+        <div class="common-info-item">用户昵称:{{ userInfo.nickname }}</div>
+        <div class="common-info-item">性别:{{ userInfo.sex }}</div>
+        <div class="common-info-item">注册时间:{{ userInfo.registerTime }}</div>
+      </div>
+    </div>
+    <div class="common-info-box">
+      <div class="common-info-header">
+        <i class="line-icon" />
+        <div class="common-info-title">统计信息</div>
+      </div>
+      <el-table :data="[statisticsInfo]" border style="margin-top: 10px">
+        <el-table-column prop="viewNum" label="浏览量" align="center" />
+        <el-table-column prop="searchNum" label="查询量" align="center" />
+        <el-table-column prop="payNum" label="支付数" align="center" />
+        <el-table-column prop="consumptionAmount" label="消费金额" align="center">
+          <template #default="scope"> ¥{{ scope.row.refundAmount }} </template>
+        </el-table-column>
+        <el-table-column prop="refundNum" label="退款数" align="center" />
+        <el-table-column prop="refundAmount" label="退款金额" align="center">
+          <template #default="scope"> ¥{{ scope.row.refundAmount }} </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <UserOrderList :id="id" />
+  </div>
+</template>
+
+<script setup name="UserDetails">
+import UserOrderList from '@/views/userManage/UserOrderList.vue';
+
+const props = defineProps({
+  id: String
+});
+const emits = defineEmits(['back']);
+const userInfo = ref({
+  id: '',
+  nickname: '',
+  sex: '',
+  registerTime: ''
+});
+// 统计信息
+const statisticsInfo = ref({
+  viewNum: 50,
+  searchNum: 12,
+  payNum: 5,
+  consumptionAmount: 99,
+  refundNum: 1,
+  refundAmount: 19.9
+});
+onMounted(() => {
+  userInfo.value = {
+    id: '1',
+    nickname: '用户昵称12',
+    sex: '男',
+    registerTime: '2022-11-23 11:10:34'
+  };
+});
+
+const handleBack = () => {
+  emits('back');
+};
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 57 - 0
src/views/userManage/UserOrderList.vue

@@ -0,0 +1,57 @@
+<template>
+  <div class="common-info-box">
+    <div class="common-info-header">
+      <i class="line-icon" />
+      <div class="common-info-title">订单记录</div>
+    </div>
+    <!-- 表格组件 -->
+    <el-table ref="multipleTable" v-loading="loading" :data="dataList" style="margin-top: 10px">
+      <el-table-column label="订单编号" align="center" prop="id" />
+      <el-table-column label="提交时间" align="center" prop="account" />
+      <el-table-column label="商品类型" align="center" prop="nickname" />
+      <el-table-column label="订单金额" align="center" prop="registerTime" />
+      <el-table-column label="支付方式" align="center" prop="lastLoginTime" />
+      <el-table-column label="订单状态" align="center" prop="amount" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-text class="common-btn-text-primary" @click="handleView(scope.row)">查看报告</el-text>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.page_size" :total="total" @pagination="getList" />
+  </div>
+</template>
+
+<script setup name="UserOrderList">
+const props = defineProps({
+  id: String
+});
+// 搜索条件
+const queryParams = reactive({
+  page: 1,
+  page_size: 10
+});
+// 表格数据
+const dataList = ref([]);
+// 加载中
+const loading = ref(false);
+// 总数
+const total = ref(0);
+
+// 获取数据
+const getList = () => {
+  loading.value = true;
+  setTimeout(() => {
+    dataList.value = [{ orderStatus: 20 }];
+    loading.value = false;
+  }, 500);
+};
+
+const handleView = (row) => {}
+getList();
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 179 - 0
src/views/userManage/index.vue

@@ -0,0 +1,179 @@
+<template>
+  <div class="app-container">
+    <div v-show="!detailState.show">
+      <transition name="fade">
+        <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="70px">
+          <el-form-item label="搜索:" prop="keywords">
+            <el-input v-model="queryParams.keywords" placeholder="请输入用户ID/账号" clearable @keyup.enter="handleQuery"/>
+          </el-form-item>
+          <el-form-item label="用户昵称:" prop="nickname">
+            <el-input v-model="queryParams.nickname" placeholder="请输入用户昵称" clearable @keyup.enter="handleQuery"/>
+          </el-form-item>
+          <el-form-item label="注册时间:">
+            <el-date-picker
+              v-model="dataRange"
+              type="datetimerange"
+              start-placeholder="开始时间"
+              end-placeholder="结束时间"
+              format="YYYY-MM-DD HH:mm:ss"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              date-format="YYYY/MM/DD"
+              time-format="hh:mm:ss"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="handleQuery">搜索</el-button>
+            <el-button @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </transition>
+      <el-row :gutter="10" class="mb8" style="margin-top: 10px">
+        <el-col :span="1.5">
+          <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete(selectedRow)">删除
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+        </el-col>
+      </el-row>
+      <!-- 表格组件 -->
+      <el-table ref="multipleTable" v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="用户ID" align="center" prop="id"/>
+        <el-table-column label="用户账号" align="center" prop="account"/>
+        <el-table-column label="用户昵称" align="center" prop="nickname"/>
+        <el-table-column label="注册时间" align="center" prop="registerTime"/>
+        <el-table-column label="上次登录时间" align="center" prop="lastLoginTime"/>
+        <el-table-column label="消费金额" align="center" prop="amount"/>
+        <el-table-column label="订单数量" align="center" prop="orderAmount"/>
+        <el-table-column label="账户状态" align="center" prop="accountStatus">
+          <template #default="scope">
+            <el-switch v-model="scope.row.accountStatus" inline-prompt active-text="ON" inactive-text="OFF"
+                       @change="handleStatusChange(scope.row)"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-text class="common-btn-text-primary" @click="handleView(scope.row)">查看</el-text>
+            <el-text class="common-btn-text-primary" @click="handleEdit(scope.row)">编辑</el-text>
+            <el-text class="common-btn-text-danger" @click="handleDelete(scope.row)">删除</el-text>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.page_size"
+                  :total="total" @pagination="getList"/>
+    </div>
+    <UserDetails v-if="detailState.show" :id="detailState.show" @back="handleBack"/>
+  </div>
+</template>
+
+<script setup name="UserManage">
+import UserDetails from '@/views/userManage/userDetails.vue';
+import {addDateRange2} from '@/utils/ruoyi.js';
+
+const {proxy} = getCurrentInstance();
+const queryFormRef = ref();
+// 搜索条件
+const queryParams = reactive({
+  keywords: '',
+  nickname: '',
+  page: 1,
+  page_size: 10
+});
+const dataRange = ref([]);
+// 表格数据
+const dataList = ref([]);
+// 加载中
+const loading = ref(false);
+// 总数
+const total = ref(0);
+// 表格选中的所有id
+const ids = ref([]);
+// 表格选中一个
+const single = ref(true);
+// 表格选中多个
+const multiple = ref(true);
+// 选中行的数据
+const selectedRow = ref(null);
+// 详情弹窗
+const detailState = ref({
+  show: false,
+  id: ''
+});
+
+// 获取数据
+const getList = () => {
+  loading.value = true;
+  const query = addDateRange2(queryParams, dataRange.value, 'startTime', 'endTime');
+  console.log(query);
+  setTimeout(() => {
+    dataList.value = [{interfacesAmount: 20}];
+    loading.value = false;
+  }, 500);
+};
+// 点击查询
+const handleQuery = () => {
+  queryParams.page = 1;
+  getList();
+};
+
+// 重置查询条件
+const resetQuery = () => {
+  dataRange.value = ['', ''];
+  if (queryFormRef.value) {
+    queryFormRef.value.resetFields(); // 重置表单并清除校验状态
+  }
+  queryParams.page = 1;
+  getList();
+};
+
+// 删除按钮操作
+const handleDelete = (row) => {
+  proxy?.$modal.confirm('是否确认删除名称为"' + row.menuName + '"的数据项?').then(() => {
+    getList();
+    proxy?.$modal.msgSuccess('删除成功');
+  });
+};
+
+const handleView = (row) => {
+  detailState.value = {
+    show: true,
+    id: row.id
+  };
+};
+
+const handleEdit = () => {
+};
+
+// 多选框选中数据
+const handleSelectionChange = (selection) => {
+  ids.value = selection.map((item) => item.reportId);
+  selectedRow.value = selection.length === 1 ? selection[0] : null;
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+//导入
+const handleImport = () => {
+};
+
+// 导出
+const handleExport = () => {
+};
+
+// 修改状态
+const handleStatusChange = (status) => {
+};
+
+const handleBack = () => {
+  detailState.value = {
+    show: false,
+    id: ''
+  };
+};
+
+getList();
+</script>
+
+<style lang="scss" scoped></style>