# ytPageComp搜索栏+按钮组+表格+分页模板组件

# 使用场景

当开发后台应用时,一定会有很多的 搜索栏+按钮组+表格+分页 的页面,此时可以直接使用此组件,快速搭建出这样的页面。

# 组件介绍

1. 搜索栏 yt-form
2. 按钮组(新增、导入、导出等自定义权限按钮 + 显示隐藏) yt-table-btn + yt-is-show-form
3. 表格 yt-table
4. 分页 yt-pagination

本组件具备以上组件的所有功能,具体使用方法可参考对应组件文档。

# 实例属性

属性名 默认值 类型 描述 是否必填
inline true Boolean 行内表单模式 true / false
formLabel [] Array 搜索条件
formRules {} Object 表单规则校验对象
labelWidth "" String 表单标签label宽度
formSize small String 组件尺寸 small / mini / medium
showOperationBtn true Boolean 是否展示 (查询、重置)按钮
searchBtnName "查询" String 查询按钮名称
resetBtnName "重置" String 重置按钮名称
btnList [] Array 工具栏按钮组(新增、删除、导入、导出等)
permiArr [] Array 工具栏按钮组权限数组(权限字符组成的数组,只会展示有权限的按钮)
tableData [] Array 表格数据(数据格式同el-table)
tableDataColumn [] Array 表格的表头数据
tableConfig {} Object 表格的配置项 详情见下方表格tableConfig配置说明
rowStyle {} Object 表格行样式 (如若需自定义样式,请注意设置tableConfig.stripe为false)
headerRowStyle {} Object 表头样式
idName "id" String 表格单行数据的唯一标识(默认为 id)
paginationConfig {} Object 表格的分页参数 + 搜索条件 详情见下方表格paginationConfig配置说明
isNeedRowDbClick false Boolean 是否需要设置表格单行的双击事件
total 0 Number 表格数据长度
pageSizes [5, 10, 15, 20] Array 表格分页大小
pageCount 7 Number 页码按钮的数量,当总页数超过该值时会折叠(大于等于 5 且小于等于 21 的奇数)
layout "total, sizes, prev, pager, next, jumper" String 组件布局,子组件名用逗号分隔 (sizes, prev, pager, next, jumper, ->, total, slot)
background true Boolean 是否为分页按钮添加背景色
paginationColor {"--activeBgColor": "#409eff", // 选中的背景色"--fontColor": "#ffffff", // 选中的字体颜色"--hoverColor": "#409eff", // 鼠标悬停的字体颜色} Object 分页按钮的样式
noSelection 请先选择要删除的数据 String 没有选择数据时的提示信息
initTableData true Boolean 是否需要在created生命周期中,初始化表格数据

# tableConfig属性

属性名 默认值 类型 描述 是否必填
loading false Boolean 是否需要添加表格loading
stripe true Boolean 是否为斑马纹
border true Boolean 是否带有纵向边框
resizable true Boolean 对应列是否可以通过拖动改变宽度(需要在 el-table 上设置 border 属性为真)
isAddIndex true Boolean 是否将分页后的序号进行累加(如为true则分页后有10条数据,第二页第一条的数据序号为11)

# paginationConfig属性

属性名 默认值 类型 描述 是否必填
pageNum 1 Number 当前表格页码
pageSize 10 Number 当前表格每页显示的条数

# 事件

事件名 参数 描述
selectClick e(随意写,可打印查看返回值) 获取yt-form 组件中formLabel里被点击的那个对象
getBtnType type(yt-table-btn 组件中,获取按钮点击的类型) 点击获取按钮的类型,需注意 新增和删除按钮已经封装好对应的方法,其他的按钮需要自行判断
showPublicDialog yt-table-btn 组件中,传入的新增按钮的点击事件( 新增、修改、详情按钮的点击事件(前提是新增、修改、详情的弹窗是公共的))
deleteRows 无需传参;其他:this.$refs.ytPageComp.selectionObj.ids(获取多选选中的ids) 删除数据,可多选删除或者删除单行数据
getTableData 获取表格数据
handleCellDbClick yt-table 組件中表格单行的双击事件(需要先设置isNeedRowDbClick为true)

# 简单使用

<!--
 * @Description: 使用ytPageComp快速新建模板组件 页面
 * @Author: mhf
 * @Date: 2023/11/27 22:04
-->

<template>
  <div class="useYtPageComp">
    <ytPageComp
      class="useYtPageComp-ytPageComp bgreen"
      ref="ytPageComp"
      :idName="idName"
      :inline="inline"
      :formLabel="formLabel"
      :formRules="formRules"
      :labelWidth="labelWidth"
      :formSize="formSize"
      :showOperationBtn="showOperationBtn"
      :searchBtnName="searchBtnName"
      :resetBtnName="resetBtnName"
      :btnList="btnList"
      :permiArr="permiArr"
      :tableData="tableData"
      :tableConfig="tableConfig"
      :tableDataColumn="tableDataColumn"
      :isNeedRowDbClick="isNeedRowDbClick"
      :total="total"
      :paginationConfig.sync="paginationConfig"
      :pageSizes="pageSizes"
      :background="background"
      :paginationColor="paginationColor"
      :init-table-data="true"
      @selectClick="selectClick"
      @getBtnType="getBtnType"
      @showPublicDialog="showPublicDialog"
      @deleteRows="deleteRows"
      @getTableData="getTableData"
      @handleCellDbClick="handleCellDbClick"
    >
      <template slot="img" slot-scope="scope">
        <el-image
          style="width: 80px; height: 110px"
          :src="scope.row.img"
          :preview-src-list="[scope.row.img]"
        />
      </template>

      <template slot="sc" slot-scope="scope">
        {{ scope.row.sc === 0 ? "暂无评分" : scope.row.sc }}
      </template>

      <template slot="operationSlot" slot-scope="scope">
        <el-button
          type="text"
          size="small"
          icon="iconfont if-biaodancaozuo-xiangqing"
          @click="doSomething(scope.row, '详情')"
          >详情
        </el-button>
        <el-button
          type="text"
          size="small"
          icon="iconfont if-biaodancaozuo-xiugai"
          @click="doSomething(scope.row, '修改')"
          >修改
        </el-button>
        <el-button
          type="text"
          size="small"
          icon="iconfont if-biaodancaozuo-shanchu"
          style="color: #fc5c5c"
          @click="doSomething(scope.row, '删除')"
          >删除
        </el-button>
      </template>
    </ytPageComp>
    <demoDialog ref="demoDialog" />
  </div>
</template>

<script>
import tableData from "./tableData";
import demoDialog from "./demoDialog.vue";
export default {
  name: "useYtPageComp",
  components: { demoDialog },
  props: {},
  dicts: [],
  data() {
    return {
      inline: true, // (可省略) 行内表单模式 true / false
      formLabel: [
        {
          label: "电影名",
          value: "nm",
          type: "input",
        },
        {
          label: "主演",
          value: "star",
          type: "input",
        },
        {
          label: "导演",
          value: "dir",
          type: "input",
        },
        {
          label: "版本",
          value: "version",
          type: "select",
          opts: [
            {
              version: "v2d imax",
            },
            {
              version: "v3d",
            },
          ],
          optLabel: "version",
          optValue: "version",
        },
        {
          label: "类型",
          value: "cat",
          type: "select",
          opts: [
            {
              cat: "剧情",
              value: "1",
            },
            {
              cat: "犯罪",
              value: "2",
            },
            {
              cat: "悬疑",
              value: "3",
            },
            {
              cat: "喜剧",
              value: "4",
            },
            {
              cat: "动画",
              value: "5",
            },
            {
              cat: "奇幻",
              value: "6",
            },
            {
              cat: "冒险",
              value: "7",
            },
            {
              cat: "谍战",
              value: "8",
            },
            {
              cat: "家庭",
              value: "9",
            },
            {
              cat: "科幻",
              value: "10",
            },
            {
              cat: "动作",
              value: "11",
            },
            {
              cat: "爱情",
              value: "12",
            },
            {
              cat: "青春",
              value: "13",
            },
          ],
          optLabel: "cat",
          optValue: "cat",
        },
        {
          label: "上映时间",
          value: "rt",
          type: "daterange",
        },
      ], // 搜索条件
      formRules: {
        nm: [
          {
            required: true,
            message: "请输入电影名",
            trigger: "blur",
          },
        ],
      }, // (可省略)表单规则校验对象
      labelWidth: "", //(可省略) 表单标签label宽度
      formSize: "mini", //(可省略) 组件尺寸 small(默认) / mini / medium
      showOperationBtn: true, //(可省略) 是否展示 (查询、重置)按钮
      searchBtnName: "搜索", //(可省略) 查询按钮名称
      resetBtnName: "重置", //(可省略) 重置按钮名称
      btnList: [
        {
          name: "新增",
          icon: "el-icon-plus",
          color: "#1492FF",
          hasPermi: "system:user:add",
        },
        {
          name: "导入",
          icon: "el-icon-s-promotion",
          color: "#1492FF",
          hasPermi: "system:user:import",
        },
        {
          name: "导出",
          icon: "el-icon-upload",
          color: "#1492FF",
          hasPermi: "system:user:export",
        },
        {
          name: "删除",
          icon: "el-icon-minus",
          color: "#fc5c5c",
          hasPermi: "system:user:delete",
        },
      ], // 工具栏按钮组(新增、删除、导入、导出等)
      permiArr: ["system:user:add", "system:user:delete", "system:user:import"],
      tableData: [],
      tableConfig: {
        loading: false,
        stripe: true, // 是否为斑马纹 table
        border: false, // 是否带有纵向边框
        resizable: false, // 对应列是否可以通过拖动改变宽度(需要在 el-table 上设置 border 属性为真)
        isAddIndex: true, // 是否将分页后的序号进行累加(如为true则分页后有10条数据,第二页第一条的数据序号为11)
      },
      tableDataColumn: [
        { label: "多选", type: "selection" },
        { label: "序号", type: "index" },
        { label: "海报", value: "img", isSlot: true, width: 100 },
        { label: "唯一标识", value: "movieId" },
        { label: "电影名", value: "nm" },
        { label: "类型", value: "cat" },
        { label: "观众评分", value: "sc", sortable: true, isSlot: true },
        { label: "主演", value: "star" },
        { label: "导演", value: "dir" },
        { label: "版本", value: "version" },
        { label: "演出信息", value: "showInfo" },
        { label: "上映时间", value: "rt" },
        { label: "操作", value: "operationSlot", isSlot: true, width: 120 },
      ],
      total: 0,
      isNeedRowDbClick: true,
      paginationConfig: {
        pageNum: 1,
        pageSize: 10,
      },
      pageSizes: [5, 10, 15, 20],
      background: true, // 是否需要自定义分页的背景颜色
      paginationColor: {
        "--activeBgColor": "pink", // 选中的背景色
        "--fontColor": "yellow", // 选中的字体颜色
        "--hoverColor": "#ff0000", // 鼠标悬停的字体颜色
      },
      idName: "movieId", // id唯一标识
    };
  },
  methods: {
    /**
     * @Event yt-form 组件中 下拉列表里面的项点击
     * @description: 组件下拉列表里面的项点击事件
     * @param: item: formLabel里被点击的那个对象,items: formLabel里被点击的那个对象(opt数组)中选中的那个对象
     * @author: mhf
     * @time: 2023-10-29 13:30:25
     **/
    selectClick(checked) {
      console.log(checked, "checked");
    },

    /**
     * @Event yt-table-btn 组件中,获取按钮点击的类型
     * @description: 点击获取按钮的类型,需注意 新增和删除按钮已经封装好对应的方法,其他的按钮需要自行判断
     * @param: 新增:传入showPublicDialog()方法
     * @param: 删除:传入deleteRows()方法
     * @author: mhf
     * @time: 2023-12-17 00:40:18
     **/
    getBtnType(type) {
      if (type === "导入") this.$message.success("你点击了导入按钮");
    },

    /**
     * @Event yt-table-btn 组件中,传入的新增按钮的点击事件
     * @description: 新增、修改、详情按钮的点击事件(前提是新增、修改、详情的弹窗是公共的)
     * @author: mhf
     * @time: 2023-12-17 00:44:53
     **/
    showPublicDialog(data, type) {
      this.$refs.demoDialog.showDialog({ data, type });
    },

    /**
     * @Event yt-table 組件中表格单行的双击事件(需要先设置isNeedRowDbClick为true)
     * @description:
     * @author: mhf
     * @time: 2023-12-17 02:59:43
     **/
    handleCellDbClick(rowData) {
      this.$message.success(`你双击了该行数据${JSON.stringify(rowData)}`);
    },

    getTableData() {
      this.tableConfig.loading = true;
      setTimeout(() => {
        this.$message.success("查询表格");
        this.tableData = tableData.slice(
          (this.paginationConfig.pageNum - 1) * this.paginationConfig.pageSize,
          this.paginationConfig.pageNum * this.paginationConfig.pageSize
        );
        this.total = tableData.length;
        this.tableConfig.loading = false;
      }, 200);
    },

    doSomething(data, type) {
      if (type === "详情" || type === "修改") {
        this.showPublicDialog(data, type);
      } else if (type === "删除") {
        this.deleteRows(data[this.idName]);
      }
    },

    /**
     * @Event 固定写法,方法名可自定义
     * @description: 删除数据,可多选删除或者删除单行数据
     * @author: mhf
     * @time: 2023-12-11 23:32:14
     **/
    deleteRows(id) {
      let ids = id || this.$refs.ytPageComp.selectionObj.ids;
      console.log(ids, "ids");
      // doSomething ...
      this.$message.success(`删除数据: ${ids}`);
    },
  },
  created() {},
  mounted() {},
};
</script>

<style lang="scss" scoped>
.useYtPageComp {
  width: 100vw;
  height: 100vh;
  position: relative;

  &-ytPageComp {
    width: calc(100vw - 200px);
    height: calc(100vh - 70px);
    position: absolute;
    right: 0;
    bottom: 0;
    overflow: hidden;
  }
}
</style>