model

修改order_item,增加uid

appmodelorder_item.js
module.exports = app => {
    const mongoose = app.mongoose;
    const Schema = mongoose.Schema;

    const d = new Date();
    const OrderItem = new Schema({
        uid: { type: Schema.Types.ObjectId },
        order_id: { type: Schema.Types.ObjectId },
        product_title: { type: String },
        product_id: { type: Schema.Types.ObjectId },
        product_img: { type: String },
        product_price: { type: Number },
        product_num: { type: Number },
        add_time: {
            type: Number,
            default: d.getTime(),
        }
    });

    return mongoose.model('OrderItem', OrderItem, 'order_item');
};

controller

appcontrollerdefaultbuy.js
'use strict';

const Controller = require('egg').Controller;

class BuyController extends Controller {

    // 去结算
    async checkout() {

        // 获取购物车选中的商品

        let orderList = [];
        let allPrice = 0;
        let cartList = this.service.cookies.get('cartList');


        //签名防止重复提交订单
        var orderSign = await this.service.tools.md5(await this.service.tools.getRandomNum());
        this.ctx.session.orderSign = orderSign;


        if (cartList && cartList.length > 0) {

            for (let i = 0; i < cartList.length; i++) {

                if (cartList[i].checked) {
                    orderList.push(cartList[i]);

                    allPrice += cartList[i].price * cartList[i].num;
                }

            }

            // 获取当前用户的所有收货地址

            const uid = this.ctx.service.cookies.get('userinfo')._id;
            const addressList = await this.ctx.model.Address.find({ uid }).sort({ default_address: -1 });


            await this.ctx.render('default/checkout.html', {
                orderList,
                allPrice,
                addressList,
                orderSign: orderSign
            });

        } else {
            // 恶意操作
            this.ctx.redirect('/cart');
        }


    }


    //提交订单


    async doOrder() {

        /*
          1、获取收货地址信息

          2、需要获取购买商品的信息

          3、把这些信息  放在订单表  
                
          4、删除购物车里面的数据    
        */

        /*防止提交重复订单*/
        var orderSign = this.ctx.request.body.orderSign;
        if (orderSign != this.ctx.session.orderSign) {
            return false;
        }
        this.ctx.session.orderSign = null;


        const uid = this.ctx.service.cookies.get('userinfo')._id;
        let addressResult = await this.ctx.model.Address.find({ "uid": uid, "default_address": 1 });
        let cartList = this.service.cookies.get('cartList');
        if (addressResult && addressResult.length > 0 && cartList && cartList.length > 0) {

            var all_price = 0;

            let orderList = cartList.filter((value) => {
                if (value.checked) {

                    all_price += value.price * value.num;
                    return value;
                }
            })

            //执行提交订单的操作

            let order_id = await this.service.tools.getOrderId();
            let name = addressResult[0].name;
            let phone = addressResult[0].phone;
            let address = addressResult[0].address;
            let zipcode = addressResult[0].zipcode;
            let pay_status = 0;
            let pay_type = '';
            let order_status = 0;


            let orderModel = new this.ctx.model.Order({ order_id, uid, name, phone, address, zipcode, pay_status, pay_type, order_status, all_price });
            let orderResult = await orderModel.save();

            if (orderResult && orderResult._id) {


                //增加商品信息

                for (let i = 0; i < orderList.length; i++) {

                    let json = {

                        "uid": uid,
                        "order_id": orderResult._id, //订单id
                        "product_title": orderList[i].title,
                        "product_id": orderList[i]._id,
                        "product_img": orderList[i].goods_img,
                        "product_price": orderList[i].price,
                        "product_num": orderList[i].num
                    }

                    let orderItemModel = new this.ctx.model.OrderItem(json);
                    await orderItemModel.save();

                }


                //删除购物车中已经购买的商品             

                var unCheckedCartList = cartList.filter((value) => {
                    if (!value.checked) {
                        return value;
                    }
                })

                this.service.cookies.set('cartList', unCheckedCartList);


                this.ctx.redirect('/buy/confirm?id=' + orderResult._id);


            } else {
                this.ctx.redirect('/buy/checkout');
            }

        } else {


            this.ctx.redirect('/buy/checkout');
        }









        console.log('提交订单');

    }

    // 确认订单  支付
    async confirm() {


        var id = this.ctx.request.query.id;


        var orderResult = await this.ctx.model.Order.find({ "_id": id });

        if (orderResult && orderResult.length > 0) {


            //获取商品

            var orderItemResult = await this.ctx.model.OrderItem.find({ "order_id": id });


            await this.ctx.render('default/confirm.html', {
                orderResult: orderResult[0],
                orderItemResult: orderItemResult,
                id: id

            });

        } else {
            //错误
            this.ctx.redirect('/');
        }

    }


    //执行多次
    async getOrderPayStatus() {

        /*

         1、获取订单号
    
         2、查询当前订单的支付状态

         3、如果支付 返回成功   如果没有支付返回失败信息


        */

        var id = this.ctx.request.query.id;

        if (id) {
            try {

                var orderReuslt = await this.ctx.model.Order.find({ "_id": id });
                if (orderReuslt && orderReuslt[0].pay_status == 1 && orderReuslt[0].order_status == 1) {
                    this.ctx.body = {
                        success: true,
                        message: '已支付'
                    }

                } else {
                    this.ctx.body = {
                        success: false,
                        message: '未支付'
                    }
                }

            } catch (error) {

                this.ctx.body = {
                    success: false,
                    message: '未支付'
                }
            }

        } else {
            this.ctx.body = {
                success: false,
                message: '未支付'
            }

        }

    }
}

module.exports = BuyController;
appcontrollerdefaultuser.js
'use strict';

const Controller = require('egg').Controller;

class UserController extends Controller {

    async welcome() {
        await this.ctx.render('default/user/welcome.html');
    }

    async order() {
        const uid = this.ctx.service.cookies.get('userinfo')._id;
        const page = this.ctx.request.query.page || 1;
        var order_status = this.ctx.request.query.order_status || -1;
        var keywords = this.ctx.request.query.keywords;




        var json = { "uid": this.app.mongoose.Types.ObjectId(uid) }; //查询当前用户下面的所有订单

        //筛选
        if (order_status != -1) {
            json = Object.assign(json, { "order_status": parseInt(order_status) });
        }

        //搜索

        if (keywords) {

            var orderItemJson = Object.assign({ "uid": this.app.mongoose.Types.ObjectId(uid) }, { "product_title": { $regex: new RegExp(keywords) } });

            var orderItemResult = await this.ctx.model.OrderItem.find(orderItemJson);

            if (orderItemResult.length > 0) {

                var tempArr = [];
                orderItemResult.forEach(value => {
                    tempArr.push({
                        _id: value.order_id
                    });
                });


                json = Object.assign(json, {
                        $or: tempArr
                    })
                    /*            
                     { uid: 5c10c2dfd702ac47bc58ab45,
                      '$or':
                      [ { _id: 5c41955b10f6400bb0c850ab },
                        { _id: 5c42a48be6389d22a4396833 } ] }

                    */

            } else {
                json = Object.assign(json, {
                    $or: [{ 1: -1 }]
                })
            }

        }

        console.log("aaa")
        console.log(JSON.stringify(json));


        const pageSize = 5;
        // 总数量
        const totalNum = await this.ctx.model.Order.find(json).countDocuments();

        //聚合管道要注意顺序

        const result = await this.ctx.model.Order.aggregate([{
                $lookup: {
                    from: 'order_item',
                    localField: '_id',
                    foreignField: 'order_id',
                    as: 'orderItems',
                },
            },
            {
                $sort: { "add_time": -1 }
            },
            {
                $match: json //条件
            },
            {
                $skip: (page - 1) * pageSize,
            },
            {
                $limit: pageSize,
            }
        ]);

        await this.ctx.render('default/user/order.html', {
            list: result,
            totalPages: Math.ceil(totalNum / pageSize),
            page,
            order_status: order_status
        });


    }

    async orderinfo() {
        // this.ctx.body = '用户订单';
        await this.ctx.render('default/user/order_info.html');
    }


    async address() {
        this.ctx.body = '收货地址';

    }
}

module.exports = UserController;

view

appviewdefaultuserorder.html
<% include  ../public/header.html%>
    <!--end header -->

    <!-- start banner_x -->
    <% include  ../public/banner.html%>
        <!-- end banner_x -->

        <script src="/public/default/js/jqPaginator.js"></script>

        <link rel="stylesheet" href="/public/default/css/order.css" />


        <!-- self_info -->
        <div class="grzxbj">
            <div class="selfinfo center">
                <div class="lfnav fl">
                    <% include  ./user_left.html%>
                </div>
                <div class="rtcont fr">
                    <h1>我的订单</h1>

                    <div class="uc-content-box">

                        <div class="box-hd">
                            <div class="more clearfix">
                                <ul class="filter-list J_orderType">
                                    <li class="first active"><a href="/user/order">全部有效订单</a></li>
                                    <li><a href="/user/order?page=<%=page%>&order_status=0">待支付</a></li>
                                    <li><a href="/user/order?page=<%=page%>&order_status=1">已支付</a></li>
                                    <li><a href="/user/order?page=<%=page%>&order_status=3">待收货</a></li>
                                    <li><a href="/user/order?page=<%=page%>&order_status=6">已关闭</a></li>
                                </ul>
                                <form id="J_orderSearchForm" class="search-form clearfix" action="#" method="get">

                                    <input class="search-text" type="search" id="J_orderSearchKeywords" name="keywords" autocomplete="off" placeholder="输入商品名称、商品编号、订单号">
                                    <input type="submit" class="search-btn iconfont" value="搜索">
                                </form>
                            </div>
                        </div>
                        <div class="box-bd">

                            <%if(list.length>0){%>

                                <table class="table">

                                    <%for(var i=0;i<list.length;i++){%>
                                        <tr <%if(list[i].pay_status==0){%>class="order_pay"
                                            <%}%>>
                                                <td colspan="2">

                                                    <div class="order-summary">

                                                        <h2>

                                                            <%if(list[i].order_status==0){%>
                                                                已下单 未支付
                                                                <%}else if(list[i].order_status==1){%>
                                                                    已付款
                                                                    <%}else if(list[i].order_status==2){%>
                                                                        已配货
                                                                        <%}else if(list[i].order_status==3){%>
                                                                            已发货
                                                                            <%}else if(list[i].order_status==4){%>

                                                                                交易成功
                                                                                <%}else if(list[i].order_status==5){%>

                                                                                    已退货
                                                                                    <%}else if(list[i].order_status==6){%>

                                                                                        无效 已取消
                                                                                        <%}%>


                                                        </h2>


                                                        <p>
                                                            <%=helper.formatTime(list[i].add_time) %> |
                                                                <%=list[i].name%> | 订单号:
                                                                    <%=list[i].order_id%> | 在线支付 实付金额:
                                                                        <%=list[i].all_price%>元</p>

                                                    </div>


                                                    <%for(var j=0;j<list[i].orderItems.length;j++){%>
                                                        <div class="order-info clearfix">

                                                            <div class="col_pic">
                                                                <img src="<%=list[i].orderItems[j].product_img%>" />
                                                            </div>
                                                            <div class="col_title">
                                                                <p>
                                                                    <%=list[i].orderItems[j].product_title%>
                                                                </p>
                                                                <p>
                                                                    <%=list[i].orderItems[j].product_price%>元 ×
                                                                        <%=list[i].orderItems[j].product_num%>
                                                                </p>

                                                            </div>
                                                        </div>
                                                        <%}%>
                                                </td>

                                                <td>
                                                    <span>


                                                    <%if(list[i].pay_status==1){%>
                                                        <a class="delete btn" href="/user/orderinfo?id=<%=list[i]._id%>">订单详情</a>
                                                        <br>
                                                        <br>
                                                        <a class="delete btn" href="#">申请售后</a>

                                                    <%}else{%>
                                                        <a class="delete btn btn-primary" href="/buy/confirm?id=<%=list[i]._id%>">去支付</a>

                                                        <br>
                                                        <br>
                                                        <a class="delete btn" href="/user/orderinfo?id=<%=list[i]._id%>">订单详情</a>
                                                    <%}%>    


                                                
                                                
                                                </span>
                                                </td>
                                        </tr>

                                        <%}%>



                                </table>



                                <div id="page" class="pagination fr"></div>


                                <%}else{%>

                                    <p style="text-align:center; padding-top:100px;">没有查找到任何订到</p>
                                    <%}%>
                        </div>
                    </div>

                    <script>
                        $('#page').jqPaginator({
                            totalPages: <%=totalPages%>,
                            visiblePages: 8,
                            currentPage: <%=page%>,
                            onPageChange: function(num, type) {
                                console.log('当前第' + num + '页', type);

                                if (type == 'change') {

                                    location.href = "/user/order?page=" + num + '&order_status=' + <%=order_status%>;
                                }
                            }
                        });
                    </script>

                </div>
                <div class="clear"></div>
            </div>
        </div>
        <!-- self_info -->

        <footer class="mt20 center">
            <div class="mt20">小米商城|MIUI|米聊|多看书城|小米路由器|视频电话|小米天猫店|小米淘宝直营店|小米网盟|小米移动|隐私政策|Select Region</div>
            <div>©mi.com 京ICP证110507号 京ICP备10046444号 京公网安备11010802020134号 京网文[2014]0059-0009号</div>
            <div>违法和不良信息举报电话:185-0130-1238,本网站所列数据,除特殊说明,所有数据均出自我司实验室测试</div>
        </footer>
        </body>

        </html>

效果

显示订单支付状态

clipboard.png

根据订单状态筛选

clipboard.png

clipboard.png

搜索

clipboard.png


渣渣辉
1.3k 声望147 粉丝

引用和评论

0 条评论