SpringBoot+Vue前后端分离项目——订单模块——订单管理页面设计

news2024/11/18 11:18:43

接口返回数据格式:

{
    "msg": "查询成功",
    "total": 1,
    "code": 200,
    "data": [
        {
            "orderId": "qwer1234",
            "userId": "1",
            "userName": "admin",
            "addressId": "573854837rytjtr5re5he345",
            "totalPrice": 559.99,
            "payStatus": "0",
            "createTime": "2023-05-21T20:56:20",
            "createBy": null,
            "updateTime": "2023-05-21T21:39:04",
            "updateBy": null,
            "remark": null,
            "mallUserAddress": {
                "addressId": "573854837rytjtr5re5he345",
                "userId": "1",
                "provinceCode": "",
                "cityCode": "",
                "regionCode": null,
                "communityId": "1",
                "nickname": "admin",
                "telephone": "18204567837",
                "completeAddress": "测试收货地址",
                "active": "1",
                "createTime": "2023-05-21T19:47:57",
                "createBy": null,
                "updateTime": "2023-05-21T19:47:59",
                "updateBy": null,
                "remark": null
            },
            "mallOrderGoodsVOList": [
                {
                    "id": "qwer1234",
                    "orderId": "qwer1234",
                    "goodsId": "7a82b0fb536345b4a89c3a4f3cb43704",
                    "price": 559.99,
                    "count": 1,
                    "totalPrice": 559.99,
                    "receive": "0",
                    "mallGoods": {
                        "goodsId": "7a82b0fb536345b4a89c3a4f3cb43704",
                        "goodsTitle": "商品五号",
                        "goodsImg": "https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
                        "goodsDetails": "这是一个测试商品55555555555555555555555555555",
                        "goodsPrice": 559.99,
                        "userId": 1,
                        "deptId": 1,
                        "stock": 100,
                        "status": "0",
                        "viewNum": 0,
                        "createTime": "2023-05-21 19:31:04",
                        "createBy": "admin",
                        "updateTime": "2023-05-21 19:31:04",
                        "updateBy": "admin",
                        "remark": null
                    }
                }
            ]
        }
    ]
}

分析返回数据格式:请求是分页查询,这里测试用只有一个订单,一个订单包含了订单基本信息和关联的收货地址表和订单商品表,一个订单包含多个订单商品。
页面实现效果:
1
Vue源码:(未给全,可自行扩展)

<template>
  <div class="app-container">
    <!-- 搜索框 -->
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
      <el-form-item label="用户账号" prop="userName">
        <el-input v-model="queryParams.userName" placeholder="请输入用户账号" clearable style="width: 240px"
          @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item label="订单状态" prop="payStatus">
        <el-select v-model="queryParams.payStatus" placeholder="订单状态" clearable style="width: 240px">
          <el-option v-for="dict in dict.type.mall_order_pay_status" :key="dict.value" :label="dict.label"
            :value="dict.value" />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>

    <!-- 操作栏 -->
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
          v-hasPermi="['mall:order:edit']">修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
          v-hasPermi="['mall:order:remove']">删除</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>

    <!-- 订单数据表格-->
    <el-card v-for="ol in orderList" :key="ol.orderId" shadow="hover">
      <!-- 订单号等信息 -->
      <div slot="header" class="clearfix orderInfo">
        <el-row type="flex" align="middle" justify="center">
          <el-col :lg="4" :xs="24">
            <div> 订单号:<el-tag>{{ ol.orderId }}</el-tag></div>
          </el-col>
          <el-col :lg="4" :xs="24">
            <div>下单用户:<el-tag>{{ ol.userName }}</el-tag></div>
          </el-col>
          <el-col :lg="6" :xs="24">
            <div>下单时间:<el-tag>{{ parseTime(ol.createTime) }}</el-tag></div>
          </el-col>
          <el-col :lg="4" :xs="24">
            <div>总价:<el-tag>{{ ol.totalPrice + '¥' }}</el-tag></div>
          </el-col>
          <el-col :lg="2" :xs="24">
            <div><dict-tag :options="dict.type.mall_order_pay_status" :value="ol.payStatus" /></div>
          </el-col>
          <el-col :lg="6" :xs="24">
            <div>
              <el-popover title="支付单号:" :content="ol.orderId" placement="top" trigger="hover">
                <el-button slot="reference" size="mini" round icon="el-icon-edit">支付单号</el-button>
              </el-popover>
              <el-button size="mini" round type="primary" icon="el-icon-view" @click="handleDetails(ol.orderId)"
                v-hasPermi="['app:news:query']">详情</el-button>
              <el-button size="mini" round icon="el-icon-edit" @click="handleNoticePay(ol.userId)"
                v-hasPermi="['app:news:edit']">提醒支付</el-button>

              <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
            v-hasPermi="['app:news:remove']">删除</el-button> -->
            </div>
          </el-col>

          <!-- <span>发货状态:</span><strong>{{ o.status }}</strong> -->
          <!-- <strong style="float: right">{{ "¥" + o.totalPrice }}</strong><span style="float: right">订单总金额:</span> -->
          <!-- <el-button style="float: right; padding: 3px 0" type="text">操作按钮</el-button> -->
        </el-row>
      </div>
      <!-- 收货地址 -->
      <div slot="header" class="clearfix mallUserAddress">
        <el-row type="flex" align="middle" justify="center">
          <el-col :lg="4" :xs="24">
            <div>收货人<el-tag>{{ ol.mallUserAddress.nickname }}</el-tag></div>
          </el-col>
          <el-col :lg="4" :xs="24">
            <div>联系方式:<el-tag>{{ ol.mallUserAddress.telephone }}</el-tag></div>
          </el-col>
          <el-col :lg="16" :xs="24">
            <div>收货地址:<el-tag>{{ ol.mallUserAddress.provinceCode + ol.mallUserAddress.cityCode +
              ol.mallUserAddress.regionCode + ol.mallUserAddress.completeAddress }}</el-tag></div>
          </el-col>
        </el-row>
      </div>
      <!-- 商品表格 -->
      <el-table v-loading="loading" :data="ol.mallOrderGoodsVOList" class="goods-table" border>
        <el-table-column v-viewer label="商品封面" width="150" align="center">
          <template slot-scope="scope">
            <el-image style="height: 80px;border-radius: 8px;" :src="scope.row.mallGoods.goodsImg"
              :fit="contain"></el-image>
          </template>
        </el-table-column>
        <el-table-column label="商品名称" prop="mallGoods.goodsTitle" :show-overflow-tooltip="true" align="center" />
        <el-table-column label="卖家" prop="mallGoods.userId" :show-overflow-tooltip="true" align="center" />
        <el-table-column label="单价" prop="price" :show-overflow-tooltip="true" align="center" />
        <el-table-column label="数量" prop="count" :show-overflow-tooltip="true" align="center" />
        <el-table-column label="总价" prop="totalPrice" :show-overflow-tooltip="true" align="center" />
        <el-table-column label="收货状态" prop="receive" :show-overflow-tooltip="true" align="center">
          <template slot-scope="scope">
            <dict-tag :options="dict.type.mall_order_goods_receive" :value="scope.row.receive" />
          </template>
        </el-table-column>
      </el-table>

    </el-card>
    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
      @pagination="getList" />

    <!-- 修改对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
      <el-form ref="form" :model="form" label-width="100px">
        <el-row>
          <el-col :span="12">
            <el-form-item label="新闻标题" prop="noticeTitle">
              <el-input v-model="form.newsTitle" placeholder="请输入新闻标题" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="新闻类型" prop="noticeType">
              <el-select v-model="form.newsType" placeholder="请选择新闻类型">
                <el-option v-for="dict in dict.type.app_news_type" :key="dict.value" :label="dict.label"
                  :value="dict.value"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="新闻内容">
              <editor v-model="form.newsContent" :min-height="190" />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>

    <!-- 新闻详情 -->
    <el-dialog :title="newsDetails.newsTitle" :data="newsDetails" :visible.sync="openDetails" width="80%" append-to-body>
      <div class="newsDetails">
        <hr />

        <div style="color: gold;text-align: end;">来源 ------ {{ newsDetails.source }}</div>

        <div style="overflow:auto;" v-viewer v-html="newsDetails.newsContent"></div>
      </div>
    </el-dialog>

  </div>
</template>

<script>
import { listOrder } from "@/api/mall/order";

export default {
  name: "Goods",
  dicts: ['sys_normal_disable', 'mall_order_pay_status', 'mall_order_goods_receive'],
  data() {
    return {
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 订单表格数据
      orderList: [],
      newsDetails: {},
      contain: "contain",
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      openDetails: false,
      // 是否显示弹出层(数据权限)
      openDataScope: false,
      // 日期范围
      dateRange: [],
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        userName: undefined,
        payStatus: undefined
      },
      // 表单参数
      form: {},
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** 查询列表 */
    getList() {
      this.loading = true;
      listOrder(this.queryParams).then(res => {
        this.orderList = res.data;
        this.total = res.total;
        this.loading = false;
      }
      );
    },
    // 详情
    handleDetails(newsId) {
      newsDetails(newsId).then(res => {
        this.newsDetails = response.data;
        this.openDetails = true
      }
      );
    },
    // 状态修改
    handleShowInAppChange(row) {
      let text = row.showInApp === 0 ? "停用" : "展示";
      this.$modal.confirm('确认要"' + text + '""' + row.newsId + '"吗?').then(function () {
        return changeNewsStatus(row.newsId, row.showInApp);
      }).then(() => {
        this.$modal.msgSuccess(text + "成功");
      }).catch(function () {
        row.showInApp = row.showInApp === 0 ? 1 : 0;
      });
    },
    // 取消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // 取消按钮(数据权限)
    cancelDataScope() {
      this.openDataScope = false;
      this.reset();
    },
    // 表单重置
    reset() {
      this.form = {
        newsTitle: undefined,
        newsType: undefined,
        newsContent: undefined
      };
      this.resetForm("form");
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.dateRange = [];
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.newsId)
      this.single = selection.length != 1
      this.multiple = !selection.length
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
      this.reset();
      newsDetails(row.newsId).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改新闻";
      });
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const newsIds = row.newsId || this.ids;
      this.$modal.confirm('是否永久删除编号为【' + newsIds + '】的新闻数据?').then(function () {
        return delNews(newsIds);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => { });
    },
    /** 提交按钮 */
    submitForm: function () {
      this.$refs["form"].validate(valid => {
        if (valid) {
          updateNews(this.form).then(res => {
            this.$modal.msgSuccess("修改成功");
            this.open = false;
            this.getList();
          });
        }
      });
    }
  }
};
</script>

<style lang="scss" scoped></style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最全JAVA面试八股文,终于整理完了,堪称2023最强

当今互联网行业中&#xff0c;Java作为一种广泛应用的编程语言&#xff0c;对于求职者来说仍是一项受欢迎的技能。然而&#xff0c;随着市场上的开发人员数量越来越多&#xff0c;Java面试的竞争也愈加激烈。 目前Java面试有着以下现状&#xff1a; 面试难度加大 与过去相比…

9:00进去,9:05就出来了,这问的也太变态了···

从外包出来&#xff0c;没想到死在另一家厂子了。 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到5月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推…

第四章 内存管理

4.1 内存的基本知识 4.1.1 知识总览 1、内存的作用&#xff1a; 内存可存放数据。程序执行前需要先放到内存中才能被CPU处理--->缓和CPU与硬盘之前的速度矛盾 2、内存的存放&#xff1a; 内存的存放类似于酒店&#xff0c;给内存的每个存储单元都编号。&#xff08;在多道…

使用柔性数组重写MyString

hello&#xff0c;各位宝子&#xff0c;今天阿崽将使用c和柔性数组的方式重新去写String类 在开始本次知识前&#xff0c;首先给大家介绍下柔性数组这个buff特点&#xff1a; 结构中的柔性数组成员前面至少要包含一个其他成员 sizeof返回的这种结构大小不包括柔性数组的内存 …

不想打工做什么好呢?厌倦打工的不妨试试以下几种赚钱方式

除开一些比较幸运的人&#xff0c;谁不是一边打工养家&#xff0c;一边在找寻好机会&#xff1f;人与人之间本来就存在诸多的不公平。有的人这辈子只能靠打工养家&#xff0c;只有少数人能不靠打工来挣钱养家&#xff0c;但是这极少部分人凭什么是你&#xff1f; 现在社会上&am…

( 数组) 209. 长度最小的子数组——【Leetcode每日一题】

❓209. 长度最小的子数组 难度&#xff1a;中等 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;…

【ArcGIS Pro二次开发】(30):数据定义语言DDL详解

在之前的文章【ArcGIS Pro二次开发】(19)&#xff1a;创建要素类&#xff08;FeatureClass&#xff09;中有涉及DDL的知识点&#xff0c;随着深入的学习&#xff0c;在这里做一个小总结。 一、DDL基本概念 ArcGIS Pro二次开发中的DDL API是一种【数据定义语言】&#xff0c;主…

【Web服务器集群】Web基础与HTTP协议

文章目录 一、Web基础1.域名概述1.1域名的概念1.2域名解析1.3域名空间结构 2.域名注册3.网页的概念4.HTML概述4.1HTML概念4.2HTML文档的结构 5.网页基本标签6.Web概述7.静态网页与动态网页7.1静态网页7.2动态网页7.3动态网页语言 二、HTTP协议1.概念2.HTTP协议的版本3.HTTP方法…

pytest+requests+Python3.7+yaml+Allure+Jenkins+docker实现接口自动化

目录 接口自动化测试框架&#xff08;用例自动生成&#xff09; 项目说明 技术栈 环境部署 框架流程图与目录结构图及相关说明 1、框架流程图如下 2、代码目录结构图如下 关联详解 函数助手详解 代码设计与功能说明 1、定义运行配置文件 runConfig.yml 2、接口配置…

构建系统安全防线!Genmai安全漏洞检测框架全面解析

01 Genmai是什么&#xff1f; Genmai是由openkylin社区SecurityGovernance SIG为了挖掘、检测、验证麒麟产品的安全漏洞而主导开发的一款开源主机漏洞扫描、网络漏洞扫描以及基线扫描的安全扫描框架。其致力于能在短时间内对主流的操作系统进行安全检测&#xff0c;并确保准确…

Unity3D :使用 UXML 实例作为模板

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 使用 UXML 实例作为模板 您可以将现有 UXML 文档实例化为 UXML 文档中的模板作为模板实例&#xff0c;类似于预制件 在 Unity 中工作。 使用 UXML 文档作为模板 要将项目中的现有…

「API 接口获取方法」

在创建一个应用程序的过程中&#xff0c;获取数据是非常关键的一步。而通过API接口获取数据通常是最好的方式之一。那么&#xff0c;如何通过关键字获取API接口呢&#xff1f;以下是一些步骤&#xff1a; 1.确定你需要获取的数据类型 首先&#xff0c;你需要确定你需要获取的…

深入浅出 SQL Server CDC 数据同步

简介 SQL Server 是一款老牌关系型数据库,自 1988 年由 Microsoft、Sybase 和 Ashton-Tate 三家公司共同推出&#xff0c;不断迭代更新至今&#xff0c;拥有相当广泛的用户群体。 如今&#xff0c;我们提到 SQL Server 通常指 Microsoft SQL Server 2000 之后的版本。 SQL S…

软件测试的7个级别,做到3级已经超越80%测试人!

有人说&#xff1a;软件测试就是最low的点点点工作。 有人说&#xff1a;测试工作职位薪水到一定程度只能原地踏步无法提升 也有人说&#xff1a;测试行业相对于开发来说技术性很低&#xff0c;容易被取代。 这其实是对测试行业最大的误解。测试可深可浅&#xff0c;可窄可广…

linux嵌入式学习

https://www.runoob.com/linux/linux-comm-ls.html https://www.bilibili.com/video/BV1w4411B7a4?p19&spm_id_frompageDriver&vd_sourcee7d12c9f66ab8294c87125a95510dac9 1 eMMC eMMC&#xff08;embedded MultiMediaCard&#xff09;是一种集成电路&#xff0c;用…

vue2+wangeditor富文本域

vue2wangeditor富文本域 效果图安装依赖初始化简约模式自定义模式图片设置只允许 base64 方式支持图片服务器 更多配置项目依赖项目代码 效果图 安装依赖 npm i wangeditor/editor wangeditor/editor-for-vue初始化 <template><div class"editor-box">…

IIS 日志解析,增强 IIS 服务器安全性

企业严重依赖 Microsoft Internet 信息服务 &#xff08;IIS&#xff09; 服务器来托管其网页和 Web 应用程序&#xff0c;以及存储其文件。请务必妥善保护您的 IIS 服务器&#xff08;包括 Web 和 FTP&#xff09;。 什么是 IIS 日志 IIS 日志是 Microsoft IIS Web 服务器上…

柔顺机构学读书笔记1:悬臂梁变形

题目&#xff1a; 如图考虑悬臂梁&#xff0c;材料各向同性&#xff0c;即各个方向上的弹性模量和强度都相同。如果在x方向上作用一个可使最大应力等于屈服强度 S S S的力 F x F_x Fx​时&#xff0c; x x x轴方向的变形为多少&#xff0c;书上给出了答案&#xff1a; 我们来验…

网易有道财报:网易有道2023财年收入将强劲增长,亏损将减少?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 预计2023年收入增长强劲&#xff0c;净亏损收窄 猛兽财经认为网易有道&#xff08;DAO&#xff09;今年是有能力实现更多的收入增长和减少亏损的。具体来说&#xff0c;我们预计网易有道的收入将在2023财年增长至少20%&am…

Semantic Kernel VS LangChain

每当向他人介绍 Semantic Kernel&#xff0c;会得到的第一个问题就是 Semantic Kernel 类似于 LangChain 吗&#xff1f;或者是 C# 版本的 LangChain 吗&#xff1f;因此我总结了这篇文章。 微软MVP实验室研究员 张善友 深圳友浩达 CTO & 首席架构师&#xff0c;微软最有价…