【VUE项目实战】57、订单管理功能介绍和基本结构搭建

接上篇《56、商品添加功能(六)-提交添加的商品
上一篇我们完成了商品列表及商品添加的所有功能功能。本篇我们开启新模块“订单管理”的开发,先进行模块的介绍和基本结构的搭建。

一、创建新分支

开发新的模块,我们需要创建新的git分支,在VScode打开终端,在控制台输入“git branch”查看我们所在的分支(可以看到是在master主分支上),然后我们使用“git checkout -b order”创建一个名为“order”的分支,可以看到自动切换到了新的分支上:

然后我们通过“git push -u origin order”指令,将本地的分支推送到云端:

然后我们前往gitee云端,可以看到新增了一个分支:

二、创建组件并定义路由规则

我们在components/路径下创建一个名为“order”的文件夹,然后在该文件夹下创建一个名为“Order.vue”的文件文件(订单列表管理组件):

然后在“Order.vue”文件中编写基本代码结构:

<template>
    <div>
        <h3>订单列表组件页面</h3>
    </div>
</template>
 
<script>
export default {
    data(){
        return{}
    },
    created(){},
    methods:{}
}
</script>
 
<style scoped>
 
</style>

然后我们在“router/index.js”下引入Order组件(别名OrderList),并在路由规则中定义路由规则(“/orders”菜单的路由):

import Vue from 'vue'
import VueRouter from 'vue-router'
import Login from '../components/Login.vue' //引用Login组件
import Home from '../components/Home.vue' 
import Welcome from '../components/Welcome.vue' 
import Users from '../components/user/Users.vue' 
import Rights from '../components/power/Rights.vue' 
import Roles from '../components/power/Roles.vue' 
import Cate from '../components/goods/Cate.vue' 
import Params from '../components/goods/Params.vue' 
import GoodsList from '../components/goods/List.vue' 
import Add from '../components/goods/Add.vue'
import Order from '../components/order/Order.vue'
 
Vue.use(VueRouter)
const routes = []
 
const router = new VueRouter({
  routes: [
    { path: '/', redirect: '/login' },
    { path: '/login', component: Login }, //定义访问页面的路由地址
    { 
      path: '/home',
      component: Home,
      redirect: '/welcome',
      children: [
        {path:'/welcome',component:Welcome},
        {path:'/users',component:Users},
        {path:'/rights',component:Rights},
        {path:'/roles',component:Roles},
        {path:'/categories',component:Cate},
        {path:'/params',component:Params},
        {path:'/goods',component:GoodsList},
        {path:'/goods/add',component:Add},
        {path:'/orders',component:Order}
      ]
    }
  ]
})
//挂载路由导航守卫
//to是我们跳转的路径,from是来自的路径,next为放行函数
router.beforeEach((to,from,next)=>{
  //如果用户访问登录页,直接放行
  if(to.path ==="/login") return next();
  //从sessionStorage中获取到保存的token值
  const tokenStr = window.sessionStorage.getItem("token");
  //没有token,强制跳转到登录页面
  if(!tokenStr) return next("/login");
  next();//有token,直接放行
})
 
export default router

然后我们刷新页面,点击订单管理->订单列表菜单,就被路由到刚刚创建的组件上了:

三、绘制订单列表基本布局

在订单列表页面,除去最基本的面包屑导航以及开片视图区域,左上角是订单名称搜索框和按钮,下方是订单表格,分别显示订单的编号、价格、是否付款和下单时间,最右侧是“修改订单地址”和“物流信息”两个操作按钮,最下面就是分页:

我们先把左上角的面包屑导航和卡片视图做出来。
首先我们将在商品管理的面包屑导航直接拷贝过来修改,然后再通过“el-card”创建一个卡片视图区域以及搜索按钮:

<template>
    <div>
        <!-- 面包屑导航 -->
        <el-breadcrumb separator-class="el-icon-arrow-right">
        <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
        <el-breadcrumb-item>订单管理</el-breadcrumb-item>
        <el-breadcrumb-item>订单列表</el-breadcrumb-item>
        </el-breadcrumb>
 
        <!-- 卡片视图 -->
        <el-card>
            <el-row :gutter="20" ><!-- gutter是指定每个分栏的间隔 -->
                <!-- 分栏一共占24格,给搜索框7格 -->
                <el-col :span="7">
                    <!-- 搜索与添加区域 -->
                    <el-input placeholder="请输入内容" clearable>
                        <el-button slot="append" icon="el-icon-search"></el-button>
                    </el-input>
                </el-col>
            </el-row>
        </el-card>
    </div>
</template>

效果:

四、获取订单列表数据

我们来看一下订单列表接口API的参数和响应结果:

●响应数据格式:

{
    "data": {
        "total": 1,
        "pagenum": "1",
        "goods": [
            {
                "order_id": 47,
                "user_id": 133,
                "order_number": "itcast-59e7502d7993d",
                "order_price": 322,
                "order_pay": "1",
                "is_send": "是",
                "trade_no": "",
                "order_fapiao_title": "个人",
                "order_fapiao_company": "",
                "order_fapiao_content": "办公用品",
                "consignee_addr": "a:7:{s:6:\"cgn_id\";i:1;s:7:\"user_id\";i:133;s:8:\"cgn_name\";s:9:\"王二柱\";s:11:\"cgn_address\";s:51:\"北京市海淀区苏州街长远天地大厦305室\";s:7:\"cgn_tel\";s:11:\"13566771298\";s:8:\"cgn_code\";s:6:\"306810\";s:11:\"delete_time\";N;}",
                "pay_status": "1",
                "create_time": 1508331565,
                "update_time": 1508331565
            }
        ]
    },
    "meta": {
        "msg": "获取成功",
        "status": 200
    }
}

可以看到传参的时候,传递的是query查询参数(模糊查询用的),以及pagenum和pagesize两个的分页参数,剩余的是用户ID、支付传统以及是否发货和订单的一些基本信息。
而返回的订单信息是封装在goods数组里的,遍历出来即可。

清楚了API的调用,我们来编写调用代码。首先在数据区域定义一个“orderlist”对象,用来承载商品列表数据,然后是“queryinfo”对象,为请求数据的默认请求参数对象;“total”为数据总数:

<script>
export default {
    data(){
        return{
            //查询条件
            queryInfo:{
                query: '',
                pagenum: 1,
                pagesize: 10
            },
            //订单列表,默认为空
            orderlist: [],
            total: 0 //数据总数
        }
    },
    created(){},
    methods:{}
}
</script>

然后在方法区定义名为“getOrderList”方法,用来获取商品数据(同时该方法在created声明周期函数中调用):

created(){
    this.getOrderList();
},
methods:{
    //根据分页获取对应的订单列表
    async getOrderList(){
        const {data: res} = await this.$http.get('orders',{params: this.queryInfo});
        if(res.meta.status!==200){
            return this.$message.error('获取订单列表失败!')
        }
        console.log(res.data);
        //报数据列表,赋值给orderlist
        this.orderlist = res.data.goods;
        //为总数据条数赋值
        this.total = res.data.total;
    }
}

我们打开浏览器访问商品列表模块,F12查看返回的数据结构:

可以看到成功获取到订单列表数据。

五、渲染订单列表

获取到数据后,我们渲染订单列表的表格。我们在卡片视图区域的“el-row”下面添加table表格区域:

<!-- table 表格区域 -->
<el-table :data="orderlist" border stripe>
    <el-table-column type="index"></el-table-column><!-- 索引列 -->
    <el-table-column label="订单编号" prop="order_number"></el-table-column>
    <el-table-column label="订单价格" prop="order_price" width="90px"></el-table-column>
    <el-table-column label="是否付款" prop="pay_status" width="70px">
        <template slot-scope="scope">
            <el-tag type="success" v-if="scope.row.pay_status=='1'">已付款</el-tag>
            <el-tag type="danger" v-else>未付款</el-tag>
        </template>
    </el-table-column>
    <el-table-column label="是否发货" prop="is_send" width="70px"></el-table-column>
    <el-table-column label="下单时间" width="140px">
        <template slot-scope="scope">
            {{scope.row.create_time | dateFormat}}
        </template>
    </el-table-column>
    <el-table-column label="操作" width="200px">
        <template slot-scope="{}">
            <el-button size= "mini" type="primary" icon="el-icon-edit"></el-button>
            <el-button size= "mini" type="success" icon="el-icon-location"></el-button>
        </template>
    </el-table-column>
</el-table>

注:“是否付款”部分,我们通过scope作用域插槽,获取是否付款的字段,使用v-if条件根据1和0来判断显示红色选项卡还是绿色选项卡。然后订单日期格式处理,使用的是之前我们在main.js中注册一个全局的时间处理器“dateFormat”。
效果:

六、分页效果

分页效果之前已经讲解过了,这里不再赘述,直接说结果。我们使用Element-UI提供的“Pagination分页”组件,在el-table下添加如下逻辑:

<!-- 分页区域 -->
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
    :current-page="queryInfo.pagenum" :page-sizes="[5, 10, 15, 20]" :page-size="queryInfo.pagesize" 
    layout="total, sizes, prev, pager, next, jumper" :total="total" background>
</el-pagination>

然后在方法区分别定义上面监听每页数量改变和页码值改变的方法:

//监听 pagesize 改变的事件
handleSizeChange(newSize){
    console.log(newSize);
    this.queryInfo.pagesize = newSize;//重新指定每页数据量
    this.getOrderList();//带着新的分页请求获取数据
},
//监听 页码值 改变的事件
handleCurrentChange(newPage){
    console.log(newPage);
    this.queryInfo.pagenum = newPage;//重新指定当前页
    this.getOrderList();//带着新的分页请求获取数据
}

注:要在element.js注册“Pagination”组件,否则会不显示。
分页效果:

至此我们的订单列表模块介绍和基础结构搭建完成。
下一篇我们继续编写订单修改收货地址的功能。

参考:黑马程序员(www.itheima.com)Vue项目实战教学视频

转载请注明出处:https://blog.csdn.net/acmman/article/details/125577526

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值