第56章 用户页面分页的渲染显示

2 \src\views\Users\UserView.vue

<template>

    <div class="wrap">

        <!--注意:1回到顶部组件及其回滚内容都必须包含到同1div容器中。-->

        <!-- 2div容器中必须有1个唯1性的样式类(例如:wrap)的定义,以便回到顶部组件进行回滚时进行定位。-->

        <!-- 3回到顶部组件  必须在所有的回滚内容之上。-->

        <el-backtop:bottom="100"target=".wrap" style="background-color:#666;">

            <el-icon style="color:#99ffff;font-size:40px;margin-top:-2px;">

                <CaretTop />

            </el-icon>

        </el-backtop>

        <el-form:model="queryForm" :rules="queryRule"ref="refRule" label-width="120px" label-position="left">

            <el-row:gutter="20">

                <el-col:span="18">

                    <el-form-item label="账户:">

                        <el-input v-model="queryForm.name"type="text" />

                    </el-form-item>

                </el-col>

                <el-col:span="6">

                    <el-form-item label="激活:">

                        <el-select v-model="queryForm.isActive">

                            <el-option label="不限" value="" />

                            <el-option label="激活" value=true />

                            <el-option label="禁用" value=false />

                        </el-select>

                    </el-form-item>

                </el-col>

            </el-row>

            <el-row:gutter="20">

                <el-col:span="18">

                    <el-form-item label="电子邮箱:">

                        <el-input v-model="queryForm.email"type="text" />

                    </el-form-item>

                </el-col>

                <el-col:span="6">

                    <el-form-item label="系统账户:">

                        <el-select v-model="queryForm.isSystemAccount">

                            <el-option label="不限" value="" />

                            <el-option label="系统账户" value=true />

                            <el-option label="其它" value=false />

                        </el-select>

                    </el-form-item>

                </el-col>

            </el-row>

            <el-row:gutter="20">

                <el-col:span="18">

                    <el-form-item label="手机:">

                        <el-input v-model="queryForm.phone"type="text" />

                    </el-form-item>

                </el-col>

                <el-col:span="6">

                    <el-form-item label="可用:">

                        <el-select v-model="queryForm.deleted">

                            <el-option label="不限" value="" />

                            <el-option label="已被删除" value=true />

                            <el-option label="可用" value=false />

                        </el-select>

                    </el-form-item>

                </el-col>

            </el-row>

            <el-row:gutter="20">

                <el-col:span="12">

                    <el-form-item label="开始日期:" prop="createdDateTimeFrom">

                        <el-date-picker style="width:100%"v-model="queryForm.createdDateTimeFrom"type="date"

                            format="YYYY-MM-DD" value-format="YYYY-MM-DD":append-to-body="false">

                        </el-date-picker>

                    </el-form-item>

                </el-col>

                <el-col:span="12">

                    <el-form-item label="结束日期:" prop="createdDateTimeTo">

                        <el-date-picker style="width:100%"v-model="queryForm.createdDateTimeTo"type="date"

                            format="YYYY-MM-DD" value-format="YYYY-MM-DD":append-to-body="false"> </el-date-picker>

                    </el-form-item>

                </el-col>

            </el-row>

            <el-row:gutter="20">

                <el-col:span="24">

                    <el-button type="primary"@click="onSubmit">

                        <el-icon style="margin-right:5px;font-size:16px;">

                            <Search />

                        </el-icon>

                       

                    </el-button>

                    <el-button@click="onResert">

                        <el-icon style="margin-right:5px;font-size:16px;">

                            <RefreshRight />

                        </el-icon>

                       

                    </el-button>

                </el-col>

            </el-row>

        </el-form>

        <el-row type="flex" justify="end" style="margin:5px 0px;">

            <el-col:span="8">

                <div class="lightgreen-box">

                    <el-button style="background-color:#79bbff;color:#FFFFFF;margin-right:10px">

                        <el-icon style="margin-right:5px;font-size:22px;">

                            <CirclePlusFilled />

                        </el-icon>

                       

                    </el-button>

                    <el-button type="danger">

                        <el-icon style="margin-right:5px;font-size:22px;">

                            <Delete />

                        </el-icon>

                        删除所选

                    </el-button>

                </div>

            </el-col>

        </el-row>

        <!--指定页面渲染显示,handleTableSort:排序;selectionChange:所选择的复选框控件,为删除所选操作提供数据支撑;-->

        <el-table:data="currentPageList"style="width:100%" :default-sort="{

                    'prop':JSON.parse(this.pagination.OrderByModel).OrderByFiled,

                    'order':JSON.parse(this.pagination.OrderByModel).OrderByType}" @sort-change="handleTableSort"ref="refTable">

            <el-table-column type="selection" width="50px" />

            <el-table-column property="id" label="编号" width="80px" sortable />

            <el-table-column property="name" label="帐号" sortable>

                <template#default="scope">

                    <el-avatar shape="square":size="70"

                        style="vertical-align:middle;margin-right:3px;float:left;">

                        <el-image:src="scope.row.avatar" :fit="fitCover"/>

                    </el-avatar>

                    <div class="userinfo-inner">

                        <span style="width:100%;height:20px;line-height:20px;">

                            {{scope.row.name}}

                        </span>

                        <br />

                        <span

                            style="width:100%;height:10px;line-height:10px;font-size:60%;color:#999999;font-weight:400;">

                            {{scope.row.email}}

                        </span>

                        <br />

                        <span

                            style="width:100%;height:10px;line-height:10px;font-size:60%;color:#999999;font-weight:400;">

                            {{scope.row.phone}}

                        </span>

                    </div>

                </template>

            </el-table-column>

            <el-table-column label="状态" align="center" width="85px">

                <template#default="scope">

                    <!--    <el-tag effect="plain" v-show="scope.row.isSystemAccount">系统帐户</el-tag>

                <el-tag type="success" v-show="!scope.row.isSystemAccount">其它</el-tag> -->

                    <el-tag effect="plain" v-show="scope.row.isSystemAccount">系统帐户</el-tag>

                    <el-tag type="success" effect="plain" v-show="!scope.row.isSystemAccount"

                        style="letter-spacing:7px;text-indent:10px">其它</el-tag>

                    <el-tag type="success" effect="plain" style="letter-spacing:7px;text-indent:10px;margin:3px 0px;"

                        v-show="scope.row.isActive">激活</el-tag>

                    <el-tag type="danger" effect="plain" style="letter-spacing:7px;text-indent:10px;margin:3px 0px;"

                        v-show="!scope.row.isActive">禁用</el-tag>

                    <el-tag type="success" effect="plain" v-show="scope.row.deleted"

                        style="letter-spacing:7px;text-indent:10px">可用</el-tag>

                    <el-tag type="danger" effect="plain" v-show="!scope.row.deleted">已被删除</el-tag>

                </template>

            </el-table-column>

            <el-table-column prop="createdDateTime" label="注册时间":formatter="dateTimeformat"width="155" sortable />

            <el-table-column prop="updatedDateTime" label="最后更新时间":formatter="dateTimeformat"width="155" sortable />

            <el-table-column align="center" width="180px">

                <template#default="scope">

                    <el-button type="primary" style="margin-right:10px;" @click="editUser(scope.row)">

                    </el-button>

                    <el-button type="danger":disabled="!scope.row.deleted||scope.row.isSystemAccount"> </el-button>

                </template>

            </el-table-column>

        </el-table>

        <!--  “->”:设定“el-pagination”分页组件靠右显示。-->

        <el-pagination v-model:current-page="this.pagination.pageIndex"v-model:page-size="this.pagination.pageSize"

            :page-sizes="[3,10,15,20,50,100]" :total="this.pagination.totalCount"prev-text="上一页" next-text="下一页"

            background layout="->, total, sizes, prev, pager, next"@size-change="handleSizeChange"

            @current-change="handleCurrentChange"/>

    </div>

</template>

<script>

    import moment from 'moment';

    import{

        postCustomerIndex,

    }from '../../common/http.api.js';

    export default{

        data() {

            //验证查询表单中的开始日期必须小于等于当前时间。

            const validateDateTimeFrom= (rule,value,callback)=>{

                if(value!=null||value!='') {

                    if(this.moment(value) >Date.now())

                        callback(new Error("开始日期必须小于等于当前时间!"));

                }

                callback();

            };

            //验证查询表单中的开始日期必须小大于等于开始日期;且小于等于当前时间。

            const validateDateTimeTo= (rule,value,callback)=>{

                if(this.queryForm.createdDateTimeFrom!='') {

                    if(value==null||value=='') {

                        callback(new Error("请输入结束日期!"));

                    }else if(this.moment(value) >Date.now()) {

                        callback(new Error("结束日期必须小于等于当前时间!"));

                    }else if(this.moment(value) <this.moment(this.queryForm.createdDateTimeFrom)) {

                        callback(new Error("结束日期必须大于等于开始日期!"));

                    }

                }

                callback();

            };

            return{

                //获取日期格式化类的1个指定实例。

                moment: moment,

                //查询表单实例初始化。

                queryForm:{

                    name: '',

                    email: '',

                    phone: '',

                    isSystemAccount: '',

                    isActive: '',

                    deleted: '',

                    createdDateTimeFrom: '',

                    createdDateTimeTo: '',

                },

                queryRule:{

                    createdDateTimeFrom:[{

                        validator: validateDateTimeFrom,

                        trigger: "blur"

                    }],

                    createdDateTimeTo:[{

                        validator: validateDateTimeTo,

                        trigger: "blur"

                    }]

                },

                //分页表实例初始化。

                pagination:{

                    pageIndex: 1,//初始化当前页,即第1页。

                    pageSize: 15,//初始化每页最多所包含的项数值,即每页最多所包含15项。

                    totalCount: 0,//初始化数据源的总计项数值,由于还没有加载数据源所以该值为:0

                    //初始化排序字段及其方式。

                    OrderByModel: JSON.stringify({

                        OrderByFiled: 'createdDateTime',

                        OrderByType: 'descending',

                    }),

                    QueryCondition: ""

                },

                //初始化当前页的渲染数据集列表实例。

                currentPageList:[],

                //初始化图片的填充方式:按照长宽比填充整个图片(https://www.w3school.com.cn/css/css3_object-fit.asp)。

                fitCover: "cover",

            };

        },

        methods:{

            //格式化日期显示。

            dateTimeformat: function(row,column) {

                let data=row[column.property];

                if(data==null) {

                    return null;

                }

                return moment(data).format('YYYY-MM-DD HH:mm:ss');

            },

            //获取当前页面渲染显示所需的数据源。

            async currentPageInit() {

                let res=await postCustomerIndex(this.pagination);

                //console.log(res.data.response.data);

                this.currentPageList=res.data.response.data;

                this.pagination.totalCount=res.data.response.totalCount;

            },

            //表单查询事件

            async onSubmit() {

                this.$refs.refRule.validate(async(valid)=>{

                    if(valid) {

                        var where= {};

                        if(this.queryForm.name!='') {

                            where.name=this.queryForm.name;

                        }

                        if(this.queryForm.email!='') {

                            where.email=this.queryForm.email;

                        }

                        if(this.queryForm.phone!='') {

                            where.phone=this.queryForm.phone;

                        }

                        if(this.queryForm.isSystemAccount!='') {

                            where.isSystemAccount=this.queryForm.isSystemAccount;

                        }

                        if(this.queryForm.isActive!='') {

                            where.isActive=this.queryForm.isActive;

                        }

                        if(this.queryForm.deleted!='') {

                            where.deleted=this.queryForm.deleted;

                        }

                        if(this.queryForm.createdDateTimeFrom!='') {

                            where.createdDateTimeFrom=this.moment(this.queryForm.createdDateTimeFrom)

                                .format('YYYY-MM-DD HH:mm:ss');

                        }

                        if(this.queryForm.createdDateTimeTo!='') {

                            where.createdDateTimeTo=this.moment(this.queryForm.createdDateTimeTo).add(

                                1,'days').format('YYYY-MM-DD HH:mm:ss');

                        }

                        console.log(where);

                        this.pagination.QueryCondition=JSON.stringify(where);

                        console.log(this.pagination.QueryCondition);

                        await this.currentPageInit();

                    }else{

                        this.$message.error('输入不能通过验证!');

                        return false;

                    }

                });

            },

            //重置页面样式及其数据。

            async onResert() {

                //重置查询表单。

                this.queryForm= {

                        name: '',

                        email: '',

                        phone: '',

                        isSystemAccount: '',

                        isActive: '',

                        deleted: '',

                        createdDateTimeFrom: '',

                        createdDateTimeTo: '',

                    };

                //重置排序字段试及其排序方式。

                this.pagination= {

                        pageIndex: 1,

                        pageSize: 15,

                        totalCount: 0,

                        OrderByModel: JSON.stringify({

                            OrderByFiled: 'createdDateTime',

                            OrderByType: 'descending',

                        }),

                        QueryCondition: ""

                    } ;

              await this.$refs.refTable.sort(JSON.parse(this.pagination.OrderByModel).OrderByFiled,

                    JSON.parse(this.pagination.OrderByModel).OrderByType);

                await this.currentPageInit();

            },

            //单击排序三角图标时所触发的事件。

            async handleTableSort({

                column

            }) {

                //防止排序方式的值为:null

                if(column.property==null&&column.order==null) {

                    column.property='createdDateTime',

                        column.order="descending";

                }else if(column.property!=null&&column.order==null) {

                    column.order="ascending";

                }

                this.pagination.OrderByModel=JSON.stringify({

                    OrderByFiled: column.property,

                    OrderByType: column.order,

                });

                await this.currentPageInit();

            },

            //该事件在改变每页最多所包含的项数值后,把数据源加载到当前页面中,并重新对当前页进行渲染显示。

            async handleSizeChange(size) {

                this.pagination.pagesize=size;

                //console.log(this.pagesize); //每页最多所包含的项数值。

                await this.currentPageInit();

            },

            //该事件在改变当前页的索引值后,把数据源加载到当前页面中,并重新对当前页进行渲染显示。

            async handleCurrentChange(currentPage) {

                this.pagination.PageIndex=currentPage;

                //console.log(this.PageIndex); //当前页的索引值。

                await this.currentPageInit();

            },

            //编辑单击事件

            async editUser(row) {

                console.log(row);

            },

        },

        async mounted() {

            await this.currentPageInit();

        },

    };

</script>

<style scoped lang="scss">

    .wrap{

        height:100%;

        overflow-x:hidden;

    }

    //表单“label”字体样式

    :deep(.el-form-item__label) {

        font-weight:400;

    }

    //修改表头样式。

    :deep(.el-table__header thead th) {

        background-color:#000000;

        color:#ffd04b;

        font-weight:400;

        text-align:center;

    }

    //修改复选框控件样式。

    :deep(.el-checkbox) {

        display:flex;

        align-items:center;

        width:25px;

        height:25px;

        //修改选中框的大小

        .el-checkbox__inner{

            width:20px;

            height:20px;

            border:#409EFF solid 2px;

            //修改选中框中的对勾的大小和位置

            &::after{

                //对号

                border:4px solid #FFFFFF;

                //不覆盖下面的 导致对号变形

                box-sizing:content-box;

                content:"";

                border-left:0;

                border-top:0;

                height:15px;

                position:absolute;

                top:-3px;

            }

        }

        //修改点击文字颜色不变

        .el-checkbox__input.is-checked+.el-checkbox__label{

            color:#333333;

        }

        .el-checkbox__label{

            line-height:25px;

            //padding-left: 8px;

        }

    }

    //表格隔行变换颜色。

    :deep(.el-table__body tbody tr:nth-child(odd)) {

        background-color:#FFFFFF;

    }

    :deep(.el-table__body tbody tr:nth-child(even)td) {

        background-color:#CCFFFF;

    }

    .userinfo-inner{

        cursor:pointer;

        float:left;

    }

    //标签控件字体样式。

    .el-tag{

        font-weight:400;

        padding:5px 5px;

    }

    //按钮控件字体样式。

    .el-button{

        font-size:100%;

        font-weight:400;

    }

    //“el-pagination”分页组件样式。

    .el-pagination{

        margin-top:10px;

        //font-size: 25px;

        //"上一页"样式。

        :deep(.btn-prev) {

            background-color:transparent;

            height:40px;

            margin-right:20px;

        }

        //"下一页"样式。

        :deep(.btn-next) {

            background-color:transparent;

            height:40px;

            margin-left:20px;

        }

        //分页索引样式。

        :deep(.number) {

            background-color:transparent;

            min-width:40px;

            height:40px;

            margin-right:15px;

        }

    }

    //“el-pagination”分页组件中下拉框控件字体样式。

    :deep(.el-input__wrapper) {

        //font-size: 25px;

    }

    .lightgreen-box{

        //background-color: lightgreen;

        //height: 24px;

        float:right;

    }

</style>

对以上功能更为具体实现和注释见:230315_014shopvue(用户页面分页的渲染显示)。


版权声明:本文为zhoujian_911原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。