首页 > 其他分享 >面对后台管理系统,全是表格类型的页面,如何快速开发

面对后台管理系统,全是表格类型的页面,如何快速开发

时间:2024-09-12 17:24:18浏览次数:10  
标签:const 表格 管理系统 59 start Date new getDate 页面

项目开始

当我们拿到设计稿或者原型图时,看到如下图展示的页面。我们就要想如何能够减少工作量,做出可复用的组件。

在这里插入图片描述
既然每个页面都长得差不多,那我们观察可以发现,这个页面分成四个部分,
【搜索部分、新增部分、表格展示部分、分页部分】
由于本人使用的vue3+ts+element-plus+sass 开发,以下是我写的代码。

搜索部分

在我们的管理后台中,常见搜索包含【输入框,下拉列表,时间选择】;当页面存在0个或者多个搜索框时,一般采用列表或者对象来传递数据。那如何定义每一个数据的数据格式,以下是我使用TS定义的属性接口

export interface searchItemInterface {
   
    key: string //这个很关键,这个是搜索框的字段
    type: string //输入框的类型
    modelValue?: string | number | undefined | boolean | string[] | Date[] //输入框的值类型
    timeFormat?: string //日期输入框显示的格式
    placeholder?: string //输入框的提示
    clearable?: boolean //是否显示删除icon
    name?: string //输入框前面的字段名
    width?: number //输入框的宽度
    change?: (arg?: any) => void //监听输入框变化函数
    options?: any[] //选择下拉框的下拉列表
}
搜索vue模板

首先我们要在components文件夹中,创建 search 文件夹,并创建,Index.vue 和index.ts 两个文件

Index.vue 文件
<template>
    <div class="search-context">
        <div class="search-box">
            <div class="search-block" v-for="(item, index) in data.list" :key="index">
                <div class="search-title" v-if="item.name !== ''">{
  { item.name }}</div>
                <div class="search-content">
                    <!-- 数字或文本输入框 -->
                    <template v-if="item.type === 'text' || item.type === 'number'">
                        <el-input
                            class="search-input"
                            :style="{ width: item.width + 'px' }"
                            :type="item.type"
                            v-model="item.modelValue"
                            :placeholder="item.placeholder ? item.placeholder : '请输入' + item.name"
                            :clearable="item.clearable"
                            @input="item.change"
                        />
                    </template>
                    <!-- 下拉框 -->
                    <template v-else-if="item.type === 'select'">
                        <el-select
                            :style="{ width: item.width + 'px' }"
                            v-model="item.modelValue"
                            :placeholder="item.placeholder ? item.placeholder : '请选择' + item.name"
                            :clearable="item.clearable"
                            @change="item.change"
                        >
                            <el-option
                                v-for="itemOption in item.options"
                                :key="itemOption.value ? itemOption.value : itemOption.id"
                                :label="itemOption.label ? itemOption.label : item.name"
                                :value="itemOption.value ? itemOption.value : itemOption.id"
                            />
                        </el-select>
                    </template>
                    <!-- 下拉框 多选框 -->
                    <template v-else-if="item.type === 'select-multiple'">
                        <el-select
                            :style="{ width: item.width + 'px' }"
                            v-model="item.modelValue"
                            :placeholder="item.placeholder ? item.placeholder : '请选择' + item.name"
                            :clearable="item.clearable"
                            multiple
                            collapse-tags
                            @change="item.change"
                        >
                            <el-option
                                v-for="itemOption in item.options"
                                :key="itemOption.value ? itemOption.value : itemOption.id"
                                :label="itemOption.label ? itemOption.label : item.name"
                                :value="itemOption.value ? itemOption.value : itemOption.id"
                            />
                        </el-select>
                    </template>
                    <!-- 时间选择器 -->
                    <template v-else-if="item.type === 'date'">
                        <el-config-provider :locale="locale">
                            <el-date-picker
                                :style="{ width: item.width + 'px' }"
                                v-model="item.modelValue"
                                type="date"
                                format="YYYY-MM-DD"
                                :value-format="item.timeFormat"
                                :placeholder="item.placeholder ? item.placeholder : '请选择' + item.name"
                                @change="item.change"
                            />
                        </el-config-provider>
                    </template>
                    <!-- 时间段选择器 -->
                    <template v-else-if="item.type === 'daterange'">
                        <el-config-provider :locale="locale">
                            <el-date-picker
                                style="width: 380px"
                                v-model="item.modelValue"
                                type="daterange"
                                range-separator="到"
                                start-placeholder="开始时间"
                                end-placeholder="结束时间"
                                :value-format="item.timeFormat"
                                :locale="locale"
                                @change="item.change"
                                :disabled-date="limitDate"
                            />
                        </el-config-provider>
                    </template>
                    <!-- 时间段选择器 精确到秒 -->
                    <template v-else-if="item.type === 'datetimerange'">
                        <el-config-provider :locale="locale">
                            <el-date-picker
                                style="width: 380px"
                                v-model="item.modelValue"
                                type="datetimerange"
                                range-separator="到"
                                start-placeholder="开始时间"
                                end-placeholder="结束时间"
                                format="YYYY-MM-DD HH:mm:ss"
                                date-format="YYYY/MM/DD ddd"
                                :locale="locale"
                                @change="item.change"
                                :shortcuts="shortcuts"
                                :disabled-date="limitDate"
                                :default-time="defaultTime"
                            />
                        </el-config-provider>
                    </template>
                    <!-- 月份选择器 -->
                    <template v-else-if="item.type === 'month'">
                        <el-date-picker
                            :style="{ width: item.width + 'px' }"
                            v-model="item.modelValue"
                            value-format="YYYY-MM"
                            type="month"
                            :placeholder="item.placeholder ? item.placeholder : '请选择' + item.name"
                        />
                    </template>
                    <!-- 开关选择器 -->
                    <template v-else-if="item.type === 'switch'">
                        <el-switch v-model="item.modelValue" />
                    </template>
                    <!-- slot -->
                    <template v-else-if="item.type === 'slot'">
                        <div :style="{ width: item.width + 'px' }"><slot name="custom"></slot></div>
                    </template>
                </div>
            </div>
            <div class="search-block btn-box">
                <div class="btn">
                    <el-button @click="onSearch" type="primary">
                        <!-- <el-icon class="el-icon--left"><Search /></el-icon> -->
                        搜索
                    </el-button>
                    <el-button @click="onReset">
                        <!-- <el-icon class="el-icon--left"><Refresh /></el-icon> -->
                        清空
                    </el-button>
                    <slot name="btn"></slot>
                </div>
                <div class="add">
                    <slot name="add"></slot>
                </div>
            </div>
        </div>
    </div>
</template>
<script lang="ts" setup>
import {
      ref, reactive } from 'vue'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
import {
      searchItemInterface, SearchData } from './index'
import {
      formatTime } from '@/utils'

/**
 * 引入element-plus中文包
 */
const locale = ref(zhCn)

/**
 * 注册父组件回调方法
 */
const emits = defineEmits(['search', 'reset'])

/**
 * 接受来自父组件的传参
 */
const props = defineProps({
     
    list: {
     
        type: Array<searchItemInterface | string | string[]>,
        default: () => {
     
            return []
        }
    },
    resetKeys: {
     
        type: Array<searchItemInterface | string>,
        default: () => {
     
            return []
        }
    },
    permission: {
     
        type: Array<string>,
        default: () => {
     
            return []
        }
    }
})

/**
 * 初始化数据
 */
const data = reactive(new SearchData(props.list))

const defaultTime: [Date, Date] = [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)] // '00:00:00', '23:59:59'

const shortcuts = [
    {
     
        text: '今天',
        value: () => {
     
            const start = new Date()
            return [
                new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, 0),
                new Date(start.getFullYear(), start.getMonth(), start.getDate(), 23, 59, 59)
            ]
        }
    },
    {
     
        text: '昨天',
        value: () => {
     
            const start = new Date()
            start.setDate(start.getDate() - 1)
            return [
                new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, 0),
                new Date(start.getFullYear(), start.getMonth(), start.getDate(), 23, 59, 59)
            ]
        }
    },
    {
     
        text: '上一周',
        value: () => {
     
            const end = new Date()
            const start = new Date()
            start.setDate(start.getDate() - 7)
            return [
                new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, 0),
                new Date(end.getFullYear(), end.getMonth(), end.getDate(), 23, 59, 59)
            ]
        }
    },
    {
     
        text: '上个月',
        value: () => {
     
            const end = new Date()
            const start = new Date()
            start.setMonth(start.getMonth() - 1)
            return [
                new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, 0),
                new Date(end.getFullYear(), end.getMonth(), end.getDate(), 23, 59, 59)
            ]
        }
    },
    {
     
        text: '最近三个月',
        value: () => {
     
            const end = new Date()
            const start = new Date()
            start.setMonth(start.getMonth() - 3)
            return [
                new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, 0)

标签:const,表格,管理系统,59,start,Date,new,getDate,页面
From: https://blog.csdn.net/aa18616377429/article/details/142178750

相关文章

  • 基于javassm小区社区物业管理系统的计算机毕设
    小区物业管理系统的设计与实现摘 要随着我国市场经济的快速发展和人们生活水平的不断提高,简单的小区服务已经不能满足人们的需求。如何利用先进的管理手段,提高业主管理水平,是当今社会所面临的一个重要课题。要想提高小区物业管理水平,必须全方位地提高业主管理意识。小区物业管理......
  • PHP体检信息管理系统-计算机毕业设计源码54850
    目录1绪论1.1选题背景1.2选题意义1.3研究的主要内容1.4论文结构与章节安排2系统分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3操作可行性分析2.2系统流程分析2.2.1数据新增流程2.2.2 数据删除流程2.3 系统功能分析2.3.1功能性分析2.......
  • 基于Node.js+vue中心医院药品管理系统的设计与实现(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着医疗技术的不断进步和人们对健康需求的日益增长,中心医院作为医疗服务的重要载体,其运营效率和管理水平直接影响到患者的治疗效果与满意度。药品作为医疗......
  • 基于Node.js+vue基于springboot的影视资讯管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网的飞速发展,影视行业迎来了前所未有的繁荣期。海量影视资源的涌现,使得用户对于高效、便捷地获取影视资讯的需求日益增长。传统的影视资讯管理方式......
  • python基于django框架医院管理系统设计与实现mysql数据库
    随着信息技术的快速发展和医疗卫生事业的不断进步,医院信息化管理已成为提高医疗服务质量和效率的重要手段。本文设计并实现了一个基于PythonDjango框架的医院管理系统,旨在为医院提供一个全面、高效、易用的信息化管理平台。本系统采用Django框架作为后端开发框架,利用其强大......
  • 基于springboot+vue的师生健康信息管理系统(源码+数据库+文档)
    师生健康信息|师生健康信息管理系统目录基于springboot+vue的师生健康信息管理系统一、前言二、系统设计三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风......
  • 基于springboot+vue的学生宿舍管理系统
    摘要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,新生宿舍管理系统当然也不能排除在外。新生宿舍管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot框架构建的一个管理系统。整个开......
  • 基于springboot小区物业管理系统
    513Springboot的小区物业管理系统小区物业管理系统摘要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于小区物业管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了小区物业管理系统,它彻底改变了过去传统的管理方式,不仅......
  • 基于django+vue车站商铺信息管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和公共交通网络的不断完善,大型车站作为城市的重要交通枢纽,其周边商业活动日益繁荣。车站商铺作为旅客服务的重要组成......
  • 基于django+vue超市销售管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代零售业的快速发展,超市作为日常生活中不可或缺的购物场所,其运营效率和顾客满意度成为了衡量成功与否的关键因素。传统的手工管理模......