element-ui表格el-table的使用

news2024/11/27 4:38:17

先给大家展示一下效果

Table 属性 

属性名说明类型可选值默认值
data显示的数据array
heightTable 的高度, 默认为自动高度。 如果 height 为 number 类型,单位 px;如果 height 为 string 类型,则这个高度会设置为 Table 的 style.height 的值,Table 的高度会受控于外部样式。string / number
max-heightTable 的最大高度。 合法的值为数字或者单位为 px 的高度。string / number
stripe是否为斑马纹 tablebooleanfalse
border是否带有纵向边框booleanfalse
sizeTable 的尺寸stringlarge / default /small
fit列的宽度是否自撑开booleantrue
show-header是否显示表头booleantrue
highlight-current-row是否要高亮当前行booleanfalse
current-row-key当前行的 key,只写属性string / number
row-class-name行的 className 的回调方法,也可以使用字符串为所有行设置一个固定的 className。function({ row, rowIndex }) / string
row-style行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style。function({ row, rowIndex }) / object
cell-class-name单元格的 className 的回调方法,也可以使用字符串为所有单元格设置一个固定的 className。function({ row, column, rowIndex, columnIndex }) / string
cell-style单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有单元格设置一样的 Style。function({ row, column, rowIndex, columnIndex }) / object
header-row-class-name表头行的 className 的回调方法,也可以使用字符串为所有表头行设置一个固定的 className。function({ row, rowIndex }) / string
header-row-style表头行的 style 的回调方法,也可以使用一个固定的 Object 为所有表头行设置一样的 Style。function({ row, rowIndex }) / object
header-cell-class-name表头单元格的 className 的回调方法,也可以使用字符串为所有表头单元格设置一个固定的 className。function({ row, column, rowIndex, columnIndex }) / string
header-cell-style表头单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有表头单元格设置一样的 Style。function({ row, column, rowIndex, columnIndex }) / object
row-key行数据的 Key,用来优化 Table 的渲染; 在使用reserve-selection功能与显示树形数据时,该属性是必填的。 类型为 String 时,支持多层访问:user.info.id,但不支持 user.info[0].id,此种情况请使用 Functionfunction(row) / string
empty-text空数据时显示的文本内容, 也可以通过 #empty 设置stringNo Data
default-expand-all是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效booleanfalse
expand-row-keys可以通过该属性设置 Table 目前的展开行,需要设置 row-key 属性才能使用,该属性为展开行的 keys 数组。array
default-sort默认的排序列的 prop 和顺序。 它的 prop 属性指定默认的排序的列,order 指定默认排序的顺序object(order: 'ascending' 'descending')如果只指定了 prop, 没有指定 order, 则默认顺序是 ascending
tooltip-effect溢出的 tooltip 的 effectstringdark / lightdark
tooltip-options 2.2.28溢出 tooltip 的选项,参见下述 tooltip 组件object请参考 tooltipobject
show-summary是否在表尾显示合计行booleanfalse
sum-text显示摘要行第一列的文本stringSum
summary-method自定义的合计计算方法function({ columns, data })
span-method合并行或列的计算方法function({ row, column, rowIndex, columnIndex })
select-on-indeterminate在多选表格中,当仅有部分行被选中时,点击表头的多选框时的行为。 若为 true,则选中所有行;若为 false,则取消选择所有行booleantrue
indent展示树形数据时,树节点的缩进number16
lazy是否懒加载子节点数据boolean
load加载子节点数据的函数,lazy 为 true 时生效function(row, treeNode, resolve)
tree-props渲染嵌套数据的配置选项object{ hasChildren: 'hasChildren', children: 'children' }
table-layout设置表格单元、行和列的布局方式stringfixed / autofixed
scrollbar-always-on总是显示滚动条booleanfalse
flexible 2.2.1确保主轴的最小尺寸booleanfalse

Table 事件 

事件名说明回调参数
select当用户手动勾选数据行的 Checkbox 时触发的事件selection, row
select-all当用户手动勾选全选 Checkbox 时触发的事件selection
selection-change当选择项发生变化时会触发该事件selection
cell-mouse-enter当单元格 hover 进入时会触发该事件row, column, cell, event
cell-mouse-leave当单元格 hover 退出时会触发该事件row, column, cell, event
cell-click当某个单元格被点击时会触发该事件row, column, cell, event
cell-dblclick当某个单元格被双击击时会触发该事件row, column, cell, event
cell-contextmenu当某个单元格被鼠标右键点击时会触发该事件row, column, cell, event
row-click当某一行被点击时会触发该事件row, column, event
row-contextmenu当某一行被鼠标右键点击时会触发该事件row, column, event
row-dblclick当某一行被双击时会触发该事件row, column, event
header-click当某一列的表头被点击时会触发该事件column, event
header-contextmenu当某一列的表头被鼠标右键点击时触发该事件column, event
sort-change当表格的排序条件发生变化的时候会触发该事件{ column, prop, order }
filter-changecolumn 的 key, 如果需要使用 filter-change 事件,则需要此属性标识是哪个 column 的筛选条件filters
current-change当表格的当前行发生变化的时候会触发该事件,如果要高亮当前行,请打开表格的 highlight-current-row 属性currentRow, oldCurrentRow
header-dragend当拖动表头改变了列的宽度的时候会触发该事件newWidth, oldWidth, column, event
expand-change当用户对某一行展开或者关闭的时候会触发该事件(展开行时,回调的第二个参数为 expandedRows;树形表格时第二参数为 expanded)row, (expandedRows | expanded)

Table 方法 

方法名说明参数
clearSelection用于多选表格,清空用户的选择
getSelectionRows返回当前选中的行
toggleRowSelection用于多选表格,切换某一行的选中状态, 如果使用了第二个参数,则可直接设置这一行选中与否row, selected
toggleAllSelection用于多选表格,切换全选和全不选
toggleRowExpansion用于可扩展的表格或树表格,如果某行被扩展,则切换。 使用第二个参数,您可以直接设置该行应该被扩展或折叠。row, expanded
setCurrentRow用于单选表格,设定某一行为选中行, 如果调用时不加参数,则会取消目前高亮行的选中状态。row
clearSort用于清空排序条件,数据会恢复成未排序的状态
clearFilter传入由columnKey 组成的数组以清除指定列的过滤条件。 如果没有参数,清除所有过滤器columnKeys
doLayout对 Table 进行重新布局。 当表格可见性变化时,您可能需要调用此方法以获得正确的布局
sort手动排序表格。 参数 prop 属性指定排序列,order 指定排序顺序。prop: string, order: string
scrollTo滚动到一组特定坐标(options: ScrollToOptions | number, yCoord?: number)
setScrollTop设置垂直滚动位置top
setScrollLeft设置水平滚动位置left

Table 插槽 

插槽名说明子标签
-自定义默认内容Table-column
append插入至表格最后一行之后的内容, 如果需要对表格的内容进行无限滚动操作,可能需要用到这个 slot。 若表格有合计行,该 slot 会位于合计行之上。
empty当数据为空时自定义的内容

Table-column 属性 

属性名说明类型可选值默认值
type对应列的类型。 如果设置了selection则显示多选框; 如果设置了 index 则显示该行的索引(从 1 开始计算); 如果设置了 expand 则显示为一个可展开的按钮stringselection / index / expand
index如果设置了 type=index,可以通过传递 index 属性来自定义索引number / function(index)
label显示的标题string
column-keycolumn 的 key, column 的 key, 如果需要使用 filter-change 事件,则需要此属性标识是哪个 column 的筛选条件string
prop字段名称 对应列内容的字段名, 也可以使用 property属性string
width对应列的宽度string / number
min-width对应列的最小宽度, 对应列的最小宽度, 与 width 的区别是 width 是固定的,min-width 会把剩余宽度按比例分配给设置了 min-width 的列string / number
fixed列是否固定在左侧或者右侧。 true 表示固定在左侧string / booleantrue / 'left' / 'right'
render-header列标题 Label 区域渲染使用的 Functionfunction({ column, $index })
sortable对应列是否可以排序, 如果设置为 'custom',则代表用户希望远程排序,需要监听 Table 的 sort-change 事件boolean / stringcustomfalse
sort-method指定数据按照哪个属性进行排序,仅当sortable设置为true的时候有效。 应该如同 Array.sort 那样返回一个 Numberfunction(a, b)
sort-by指定数据按照哪个属性进行排序,仅当 sortable 设置为 true 且没有设置 sort-method 的时候有效。 如果 sort-by 为数组,则先按照第 1 个属性排序,如果第 1 个相等,再按照第 2 个排序,以此类推function(row, index) / string / array
sort-orders数据在排序时所使用排序策略的轮转顺序,仅当 sortable 为 true 时有效。 需传入一个数组,随着用户点击表头,该列依次按照数组中元素的顺序进行排序array数组中的元素需为以下三者之一:ascending 表示升序,descending 表示降序,null 表示还原为原始顺序['ascending', 'descending', null]
resizable对应列是否可以通过拖动改变宽度(需要在 el-table 上设置 border 属性为真)booleantrue
formatter用来格式化内容function(row, column, cellValue, index)
show-overflow-tooltip当内容过长被隐藏时显示 tooltipboolean \object 2.2.28参考表格的 tooltip-options
align对齐方式stringleft / center / rightleft
header-align表头对齐方式, 若不设置该项,则使用表格的对齐方式stringleft / center / right
class-name列的 classNamestring
label-class-name当前列标题的自定义类名string
selectable仅对 type=selection 的列有效,类型为 Function,Function 的返回值用来决定这一行的 CheckBox 是否可以勾选function(row, index)
reserve-selection数据刷新后是否保留选项,仅对 type=selection 的列有效, 请注意, 需指定 row-key 来让这个功能生效。booleanfalse
filters数据过滤的选项, 数组格式,数组中的元素需要有 text 和 value 属性。 数组中的每个元素都需要有 text 和 value 属性。Array<{text: string, value: string}>
filter-placement过滤弹出框的定位string与 Tooltip 的 placement 属性相同
filter-multiple数据过滤的选项是否多选booleantrue
filter-method数据过滤使用的方法, 如果是多选的筛选项,对每一条数据会执行多次,任意一次返回 true 就会显示。function(value, row, column)
filtered-value选中的数据过滤项,如果需要自定义表头过滤的渲染方式,可能会需要此属性。array

Table-column 插槽 

插槽名说明
自定义列的内容 作用域参数为 { row, column, $index }
header自定义表头的内容, 作用域参数为 { column, $index }

表格部分代码

  <!--表格数据展示 start-->
      <el-table :data="dataList.list" style="width:1300px;">
        <el-table-column prop="bookImg" label="图片" width="150" align="center">
          <template #default="scope">
            <img :src="scope.row.bookImg" style="height:60px"/>
          </template>
        </el-table-column>
        <el-table-column  prop="bookTypeId" label="类型" width="100px">
          <template #default="scope">
                <span v-for="item in typeList.list" :key="item.bookTypeId">
                    {{ scope.row.bookTypeId == item.bookTypeId ? item.bookTypeName : '' }}
                </span>
          </template>
        </el-table-column>
        <el-table-column  prop="bookName" label="名称" width="100" align="center">
          <template #default="scope">
            <div style="color: #6ca7ef;" v-html="scope.row.bookName"></div>
          </template>
        </el-table-column>
        <el-table-column prop="bookPrice" label="价格" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookWriter" label="作者" width="60" align="center">
        </el-table-column>
        <el-table-column show-overflow-tooltip prop="bookPublishHouse" label="出版社" width="80" align="center">
        </el-table-column>
        <el-table-column prop="bookPublishTime" label="出版时间" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookISBN" label="ISBN号" width="100"
                         align="center"></el-table-column>
        <el-table-column prop="bookStock" label="库存" width="100" align="center"></el-table-column>
        <el-table-column prop="bookSalvesVolume" label="销量" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookCatalog" label="目录" width="60" align="center">
        </el-table-column>
        <el-table-column show-overflow-tooltip prop="bookDesc" label="简介" width="60" align="center">
        </el-table-column>
        <el-table-column label="操作" width="200" align="center">
          <template #default="scope">
            <el-button round size="small" type="primary"
                       @click="handleEdit(scope.$index, scope.row)">修改
            </el-button>
            <el-button round size="small" type="danger"
                       @click="handleDelete(scope.$index, scope.row)">删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      <!--表格数据展示 end-->

全部代码 

<template>
  <div class="data-container">
    <!--添加 start-->
    <div class="data-header">
      <!--优化:@keyup.enter="searchHandle"回车时触发searchHandle事件-->
      <el-input class="input" @keyup.enter="searchHandle" v-model="searchInfo" size="large"
                placeholder="请输入名称/作者/出版社"></el-input>
      <el-button @click="searchHandle" class="button" size="large" type="primary" plain>搜索</el-button>
      <el-button @click="addHander" style="margin-left: 40px;" size="large" class="button" type="primary">
        <el-icon>
          <DocumentAdd/>
        </el-icon>&nbsp;添加
      </el-button>
    </div>
    <!--添加 end-->
    <div class="data-table">
      <!--表格数据展示 start-->
      <el-table :data="dataList.list" style="width:1300px;">
        <el-table-column prop="bookImg" label="图片" width="150" align="center">
          <template #default="scope">
            <img :src="scope.row.bookImg" style="height:60px"/>
          </template>
        </el-table-column>
        <el-table-column  prop="bookTypeId" label="类型" width="100px">
          <template #default="scope">
                <span v-for="item in typeList.list" :key="item.bookTypeId">
                    {{ scope.row.bookTypeId == item.bookTypeId ? item.bookTypeName : '' }}
                </span>
          </template>
        </el-table-column>
        <el-table-column  prop="bookName" label="名称" width="100" align="center">
          <template #default="scope">
            <div style="color: #6ca7ef;" v-html="scope.row.bookName"></div>
          </template>
        </el-table-column>
        <el-table-column prop="bookPrice" label="价格" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookWriter" label="作者" width="60" align="center">
        </el-table-column>
        <el-table-column show-overflow-tooltip prop="bookPublishHouse" label="出版社" width="80" align="center">
        </el-table-column>
        <el-table-column prop="bookPublishTime" label="出版时间" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookISBN" label="ISBN号" width="100"
                         align="center"></el-table-column>
        <el-table-column prop="bookStock" label="库存" width="100" align="center"></el-table-column>
        <el-table-column prop="bookSalvesVolume" label="销量" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookCatalog" label="目录" width="60" align="center">
        </el-table-column>
        <el-table-column show-overflow-tooltip prop="bookDesc" label="简介" width="60" align="center">
        </el-table-column>
        <el-table-column label="操作" width="200" align="center">
          <template #default="scope">
            <el-button round size="small" type="primary"
                       @click="handleEdit(scope.$index, scope.row)">修改
            </el-button>
            <el-button round size="small" type="danger"
                       @click="handleDelete(scope.$index, scope.row)">删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      <!--表格数据展示 end-->
      <!--分页 start-->
      <div class="page">
        <el-pagination @current-change="currentChangeHaddler" background layout="prev,pager,next,jumper"
                       default-page-size="defaultPageSize" :total="totalData"></el-pagination>
      </div>
      <!--分页 end-->
      <!--添加对话框 start-->
      <el-dialog draggable destroy-on-close v-model="dialogAddVisible" title="添加" width="70%" center>
        <el-form :inline="true" :model="addFormInfo" status-icon label-width="120px">
          <el-form-item label="图片">
            <el-upload list-type="picture-card" action="http://localhost:8040/file/localhost/upload"
                       :on-success="onUploadAddSuccess" :on-remove="handleAddRemove">
              <el-icon>
                <Plus/>
              </el-icon>
            </el-upload>
          </el-form-item>
          <el-form-item label="类型">
            <el-select v-model="addFormInfo.bookTypeId" class="m-2" placeholder="请选择书籍类型" size="large">
              <el-option v-for="item in typeList.list" :key="item.bookTypeId" :label="item.bookTypeName"
                         :value="item.bookTypeId"/>
            </el-select>
          </el-form-item>
          <el-form-item label="名称">
            <el-input v-model="addFormInfo.bookName"></el-input>
          </el-form-item>
          <el-form-item label="价格">
            <el-input v-model="addFormInfo.bookPrice"></el-input>
          </el-form-item>
          <el-form-item label="作者">
            <el-input v-model="addFormInfo.bookWriter"></el-input>
          </el-form-item>
          <el-form-item label="出版社">
            <el-input v-model="addFormInfo.bookPublishHouse"></el-input>
          </el-form-item>
          <el-form-item label="出版时间">
            <el-input v-model="addFormInfo.bookPublishTime"></el-input>
          </el-form-item>
          <el-form-item label="ISBN号">
            <el-input v-model="addFormInfo.bookISBN"></el-input>
          </el-form-item>
          <el-form-item label="库存">
            <el-input v-model="addFormInfo.bookStock"></el-input>
          </el-form-item>
          <el-form-item label="销量">
            <el-input v-model="addFormInfo.bookSalvesVolume"></el-input>
          </el-form-item>
          <el-form-item label="目录">
            <el-input style="width: 800px" :rows="6" type="textarea" v-model="addFormInfo.bookCatalog"></el-input>
          </el-form-item>
          <el-form-item label="简介">
            <el-input style="width: 800px" :rows="6" type="textarea" v-model="addFormInfo.bookDesc"></el-input>
          </el-form-item>

        </el-form>
        <template #footer>
                    <span class="dialog-footer">
                        <el-button @click="dialogAddVisible = false">取消</el-button>
                        <el-button type="primary" @click="sureHandler">确定</el-button>
                    </span>
        </template>
      </el-dialog>
      <!--添加对话框 end-->
      <!--编辑对话框 start-->
      <el-dialog draggable destroy-on-close v-model="dialogEditorVisible" title="修改" width="70%" center>
        <el-form :inline="true" :model="editorFormInfo" label-width="120px">
          <el-form-item label="图片">
            <el-upload list-type="picture-card" action="http://localhost:8040/file/localhost/upload"
                       :show-file-list="false"
                       :on-success="onUploadEditorSuccess">
              <img v-if="fileEditorPath" :src="fileEditorPath" class="avatar" style="height:60px"/>
              <el-icon v-else class="avatar-uploader-icon">
                <Plus/>
              </el-icon>
            </el-upload>
          </el-form-item>
          <el-form-item label="类型">
            <el-select v-model="editorFormInfo.bookTypeId" class="m-2" placeholder="Select" size="large">
              <el-option v-for="item in typeList.list" :key="item.bookTypeId" :label="item.bookTypeName"
                         :value="item.bookTypeId"/>
            </el-select>
          </el-form-item>
          <el-form-item label="名称">
            <el-input v-model="editorFormInfo.bookName"></el-input>
          </el-form-item>
          <el-form-item label="价格">
            <el-input v-model="editorFormInfo.bookPrice"></el-input>
          </el-form-item>
          <el-form-item label="作者">
            <el-input v-model="editorFormInfo.bookWriter"></el-input>
          </el-form-item>
          <el-form-item label="出版社">
            <el-input v-model="editorFormInfo.bookPublishHouse"></el-input>
          </el-form-item>
          <el-form-item label="出版时间">
            <el-input v-model="editorFormInfo.bookPublishTime"></el-input>
          </el-form-item>
          <el-form-item label="ISBN号">
            <el-input v-model="editorFormInfo.bookISBN"></el-input>
          </el-form-item>
          <el-form-item label="库存">
            <el-input v-model="editorFormInfo.bookStock"></el-input>
          </el-form-item>
          <el-form-item label="销量">
            <el-input v-model="editorFormInfo.bookSalvesVolume"></el-input>
          </el-form-item>
          <el-form-item label="目录">
            <el-input style="width: 800px" :rows="6" type="textarea" v-model="editorFormInfo.bookCatalog"></el-input>
          </el-form-item>
          <el-form-item label="简介">
            <el-input style="width: 800px" :rows="6" type="textarea" v-model="editorFormInfo.bookDesc"></el-input>
          </el-form-item>
        </el-form>
        <template #footer>
                    <span class="dialog-footer">
                        <el-button @click="dialogEditorVisible = false">取消</el-button>
                        <el-button type="primary" @click="sureEditorHandler">确定</el-button>
                    </span>
        </template>
      </el-dialog>
      <!--编辑对话框 end-->
    </div>
  </div>
</template>
<script setup>
import axios from "@/utils/request.js"
import {onMounted, reactive, ref} from "vue";
//初始化类型列表
const typeList = reactive({
  list: []
})
//数据列表
const dataList = reactive({
  list: []
})
//数据总条数
const totalData = ref(0)
//当前页
const currentPage = ref(1)
//初始化分页显示条数
const defaultPageSize = ref(5)
//搜索初始化状态
const searchInfo = ref("")
//添加-上传后图片地址
const fileAddPath = ref(0)
//编辑-上传后图片地址
const fileEditorPath = ref(0)
//添加添加对话框控制器
const dialogAddVisible = ref(false)
//初始化添加对话框状态
const addFormInfo = reactive({

  bookImg: "",
  bookName: "",
  bookPrice: "",
  bookWriter: "",
  bookPublishHouse: "",
  bookPublishTime: "",
  bookISBN: "",
  bookStock: "",
  bookSalvesVolume: "",

  bookCatalog: "",

  bookDesc: "",

  bookTypeId: "",

})
//编辑对话框控制器
const dialogEditorVisible = ref(false)
//初始化编辑对话框状态
const editorFormInfo = reactive({
  bookId: "",
  bookImg: "",
  bookName: "",
  bookPrice: "",
  bookWriter: "",
  bookPublishHouse: "",
  bookPublishTime: "",
  bookISBN: "",
  bookStock: "",
  bookSalvesVolume: "",

  bookCatalog: "",

  bookDesc: "",

  bookTypeId: "",

})
/**
 * 网路请求:分页查询
 *  */
const http = (search, page, size) => {
  axios.get('/book/book/search', {
    params: {
      search,
      page,
      size
    }
  }).then(res => {
    if (res.data.code == 200) {
      dataList.list = res.data.data.records
      totalData.value = res.data.data.total
    } else {
      ElMessage.error(res.data.message)
    }

  })
}
onMounted(() => {
  http(null, 1, 5)
  axios.get('/book/bookType/findAll').then(res => {
    typeList.list = res.data.data
    console.log(typeList.list[0])
  })
})
/**
 * 添加时文件上传成功时的钩子
 */
const onUploadAddSuccess = (response, uploadFile) => {
  console.log(response)//http://192.168.66.101/group1/M00/00/00/wKhCZWQZ2Y6AfdIDAADHg7AcneY285.jpg
  console.log(uploadFile.raw.name)//springboot.jpg
  fileAddPath.value = response.data
}
/**
 * 编辑时文件上传成功时的钩子
 */
const onUploadEditorSuccess = (response, uploadFile) => {
  //console.log(response.data)//http://192.168.66.101/group1/M00/00/00/wKhCZWQZ2Y6AfdIDAADHg7AcneY285.jpg
  //console.log(uploadFile.raw.name)//springboot.jpg
  fileEditorPath.value = response.data
}
/**
 * 添加时文件移除时的操作
 */
const handleAddRemove = (file, files) => {
  //console.log(file.url)//file.url---blob:http://127.0.0.1:81/87591d3e-43e3-4032-bd61-c26867d32f0e
  //console.log(fileAddPath.value)
  axios.post('/book/book/delete', {
    params: {
      filePath: fileAddPath.value
    }
  }).then(res => {
    if (res.data.code == 200) {
      fileAddPath.value = null
      ElMessage.success("上传时移除图片成功")
    }
  })
}
/**
 * 分页
 */
const currentChangeHaddler = (val) => {
  http(searchInfo.value, val, 5)
  currentPage.value = val
}
/**
 * 搜索按钮
 */
const searchHandle = () => {
  http(searchInfo.value, 1, 5)
}
/**
 * 添加对话框弹出事件
 */
const addHander = () => {
  dialogAddVisible.value = true
}
/**
 * 添加对话框 确定事件
 */
const sureHandler = () => {
  axios.post('/book/book/add', {
    bookName: addFormInfo.bookName,
    bookPrice: addFormInfo.bookPrice,
    bookImg: fileAddPath.value,
    bookWriter: addFormInfo.bookWriter,
    bookPublishHouse: addFormInfo.bookPublishHouse,
    bookPublishTime: addFormInfo.bookPublishTime,
    bookISBN: addFormInfo.bookISBN,
    bookStock: addFormInfo.bookStock,
    bookSalvesVolume: addFormInfo.bookSalvesVolume,
    bookCatalog: addFormInfo.bookCatalog,
    bookDesc: addFormInfo.bookDesc,
    bookTypeId: addFormInfo.bookTypeId,
  }).then(res => {
    if (res.data.code == 200) {
      dialogAddVisible.value = false
      //刷新页面
      http(null, currentPage.value, 5)
      fileAddPath.value = null
    } else {
      ElMessage.error(res.data.message)
    }
  })
}
/**
 * 编辑对话框 弹出事件
 *  */
const handleEdit = (index, row) => {
  dialogEditorVisible.value = true
  axios.get('/book/book/findById', {
    params: {
      bookId: row.bookId
    }
  }).then(res => {
    if (res.data.code == 200) {
      editorFormInfo.bookId = res.data.data.bookId;
      fileEditorPath.value = res.data.data.bookImg;
      editorFormInfo.bookPrice = res.data.data.bookPrice;
      editorFormInfo.bookWriter = res.data.data.bookWriter;
      editorFormInfo.bookPublishHouse = res.data.data.bookPublishHouse;
      editorFormInfo.bookPublishTime = res.data.data.bookPublishTime;
      editorFormInfo.bookISBN = res.data.data.bookISBN;
      editorFormInfo.bookStock = res.data.data.bookStock;
      editorFormInfo.bookSalvesVolume = res.data.data.bookSalvesVolume;
      editorFormInfo.bookCatalog = res.data.data.bookCatalog;
      editorFormInfo.bookDesc = res.data.data.bookDesc;
      editorFormInfo.bookTypeId = res.data.data.bookTypeId;
    } else {
      ElMessage.error(res.data.data.message)
    }
  })

}
/**
 * 编辑对话框 确定事件
 */
const sureEditorHandler = () => {
  axios.post('/book/book/update', {
    bookId: editorFormInfo.bookId,
    bookName: editorFormInfo.bookName,
    bookPrice: editorFormInfo.bookPrice,
    bookImg: fileEditorPath.value,
    bookWriter: editorFormInfo.bookWriter,
    bookPublishHouse: editorFormInfo.bookPublishHouse,
    bookPublishTime: editorFormInfo.bookPublishTime,
    bookISBN: editorFormInfo.bookISBN,
    bookStock: editorFormInfo.bookStock,
    bookSalvesVolume: editorFormInfo.bookSalvesVolume,
    bookCatalog: editorFormInfo.bookCatalog,
    bookDesc: editorFormInfo.bookDesc,
    bookTypeId: editorFormInfo.bookTypeId,
  }).then(res => {
    if (res.data.code == 200) {
      dialogEditorVisible.value = false
      http(null, currentPage.value, 5)
    } else {
      ElMessage.error(res.data.message)
    }
  })
}

/**删除 */
const handleDelete = (index, row) => {
  ElMessageBox.confirm(
      '确定删除么',
      '删除',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      }
  ).then(() => {
    //确认删除
    axios.delete("/book/book/delete", {
      params: {
        bookId: row.bookId
      }
    }).then(res => {
      if (res.data.code == 200) {
        ElMessage({
          type: 'success',
          message: "删除成功!!!",
        })
        //刷新
        http(null, currentPage.value, 5)
      } else {
        ElMessage({
          type: 'error',
          message: res.data.message,
        })
      }
    })
  }).catch(error => {
    ElMessage({
      type: 'info',
      message: "取消删除",
    })
  })


}
</script>
<style scoped>
.el-carousel__item:nth-child(2n + 1) {
  background-color: #d3dce6;
}

.data-header {
  background: linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -o-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -ms-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -moz-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -webkit-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  padding: 20px;
  width: 100%;
  background-attachment: #fff;
  box-sizing: border-box;
}

.data-header span {
  color: #6ca7ef;
  font-weight: 700;
}

.data-header .input {
  width: 300px;
}

.data-table {
  background: linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -o-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -ms-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -moz-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -webkit-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  padding: 20px;
  display: flex;
  width: 100%;
  height: 700px;
}

.page {
  /**分页模块*/
  /**固定定位 元素的位置相对于浏览器窗口是固定位置。即使窗口是滚动的它也不会移动 */
  position: fixed;
  right: 10px;
  bottom: 100px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初阶指针(详解)

目录 前言 一 指针是什么 计算机又是如何编址的&#xff1f; 总结 二 指针和指针类型 指针-整数 总结&#xff1a; 指针的解引用 总结 三 野指针 概念 野指针的成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间被释放 如何规避野指针 四 指针运算…

iMazing2.16.9中文最新版iOS设备管理器下载教程

iMazing2.16.9是一款兼容Win和Mac的iOS设备管理软件。iMazing能够将音乐、文件、消息和应用等数据从任何 iPhone、iPad 或 iPod 传输到 Mac 或 PC 上。iMazing轻松管理和备份您的 iOS 设备,无需使用 iTunes&#xff0c;iMazing以自己的方式管理 iPhone。让备受信赖的软件为您传…

遗传算法(附简单案例及matlab详细代码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、生物进化二、遗传算法原…

华为OD机试真题 Java 实现【按身高和体重排队】【2022Q4 100分】,附详细解题思路

一、题目描述 某学校举行运动会&#xff0c;学生们按编号(1、2、3…n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列&#xff1b; 对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。请输出排列后的学生…

全闪SDS三节点EC(4+2:1)性能挑战测试

前段时间咱们存储圈在讨论一下全闪SDS性能挑战&#xff1a; 三节点集群&#xff0c;用EC&#xff08;42:1&#xff09;&#xff0c;性能目标是&#xff1a;4KB随机读写7:3&#xff0c;达到100万IOPS&#xff0c;平均时延0.5ms&#xff0c;P99时延1ms。硬件配置&#xff1a;网络…

菜鸟的刷题之路之二叉树

&#x1f495;“成功不是终点&#xff0c;失败不是终结&#xff0c;勇气才是启程的第一步。”&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;菜鸟的刷题之路&#x1f386; &#x1f697;本文章主要内容&#xff1a;将…

GORM---创建

目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义 定义一个PersonInfo结构体。 type PersonInfo struct {Id uint64 gorm:"column:id;primary_key;NOT NULL" json:"id"UserName string gorm:"co…

路径规划算法:基于狮群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法狮群…

Prometheus+Grafana(外)监控Kubernetes(K8s)集群(基于containerd)

一、实验环境 1、k8s环境 版本v1.26.5 二进制安装Kubernetes(K8s)集群(基于containerd)—从零安装教程&#xff08;带证书&#xff09; 主机名IP系统版本安装服务master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxymaster021…

在 Ubuntu 20.04 上安装 Nginx

保证以 sudo 用户身份登录&#xff0c;并且你不能运行 Apache 或者 其他处理进程在80端口和443端口。 安装 Nginx Nginx 在默认的 Ubuntu 源仓库中可用。想要安装它&#xff0c;运行下面的命令&#xff1a; sudo apt update sudo apt install nginx 一旦安装完成&#xff0…

Redis高级数据结构之Bitmaps

Bitmaps的介绍 现代计算机使用二进制位作为信息存储的基本单元。一个字节&#xff08;Byte&#xff09;等于8个二进制位&#xff08;bit&#xff09;。合理的使用位能有效提高内存使用率和开发效率。位是最小信息单位&#xff0c;可以表示两个状态之一。字节是更大的单位&…

虚拟机搭建

Linux(CentOS-7.6-x64位)基础配置, 虚拟机平台VmWare15 CentOS-7.6-x64镜像下载&#xff1a; https://www.aliyundrive.com/s/72Xg449t6i8 提取码: 32rm VmVare15安装包下载带序列号&#xff1a;VmVare15安装包下载带激活序列号资源-CSDN文库 点击关闭&#xff0c;点击完成&…

深入理解Jar文件:创建、使用和多版本控制

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f35b; 一、创建JAR文件 &#x1f35c; 二、安装和使用清单文件 &#x1f35d; 三、创建可执行的JAR文件 &#x1f360; 四、多版…

微信小程序开发实战 ②②(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

网络安全大厂面试题合集+

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

近年GDC服务器分享合集(三): 《Sky光·遇》实现百万在线:一种云原生的扩容方法

如今&#xff0c;游戏行业对于云原生技术的使用越来越广泛。特别是那些拥有海量玩家在线的游戏&#xff0c;使用云原生技术可以轻松做到高可用、弹性扩容和降低成本。在GDC 2022上&#xff0c;来自《Sky光遇》项目的工程师分享了相关的经验——《《Sky光遇》实现百万在线&#…

黑马Redis视频教程高级篇(一:分布式缓存)

目录 分布式缓存 一、Redis持久化 1.1、RDB持久化 1.1.1、执行时机 1.1.2、RDB原理 1.1.3、小结 1.2、OF持久化 1.2.1、AOF原理 1.2.2、OF配置 1.2.3、AOF文件重写 1.3、RDB与AOF对比 二、Redis主从 2.1、搭建主从架构 2.1.1、集群结构 2.1.2、准备实例和配置 …

基于springboot汽车站车辆运管系统java+vue

本汽车站车辆运管系统管理员可以管理个人中心&#xff0c;业务管理&#xff0c;站务管理&#xff0c;人力资源管理&#xff0c;办公司管理&#xff0c;财务管理。因而具有一定的实用性。本站是一个B/S模式系统&#xff0c;采用springboot框架&#xff0c;MYSQL数据库设计开发&a…

模型的细分和简化

​ 细分 本质为引入更多三角形 loop细分 对于新的顶点如何计算&#xff1a;下图中白点位置计算 对于旧的顶点位置计算 Catmull-Clark细分 对于非四边形的图形细分方法&#xff1a;不断将非四边形进行细分即可 下图中橙色&#xff1a;非四边形面的重心坐标&#xff1b;紫色&…

程序员必须了解的消息队列之王-Kafka

1. Kafka概述 1.1 定义 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台。 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 1.2 消息队列 1.2.1 传统消息队列的应用场景 1.2.2 为什…