vue3 + element-plus + ts el-table封装

vue3 + element-plus + ts el-table封装

博客参考https://blog.csdn.net/weixin_45291937/article/details/125523244
1. 文件位置(根据自己的需求)
在这里插入图片描述

2. 在 custom 文件夹下面 创建 mytable 文件夹
3. 直接上代码

// index.vue<template><div class="el-table-box"><el-table ref="tableRef" check-strictly :class="[_options.showPagination ? 'isActive' : 'active']" :data="tableData" v-loading="fullLoading" v-bind="_options" default-expand-all highlight-current-row @selection-change="handleSelectionChange" @row-click="handleRowClick" @cell-click="handleCellClick" @sort-change="handleSortChange"><el-table-column v-if="_options.showCheckout" :index="indexMethod" v-bind="{ type: 'selection', width: '50' }"></el-table-column><template v-for="(col, index) in  columns " :key="index"><!---复选框, 序号 (START)--><el-table-column v-if="col.type === 'expand' || col.type === 'customCell'" :index="indexMethod" v-bind="col"><!-- 当type等于expand时, 配置通过h函数渲染、tsx语法或者插槽自定义内容 --><template #default="{ row, $index }"><!-- render函数 (START) : 使用内置的component组件可以支持h函数渲染和txs语法 --><component v-if="col.render" :is="col.render" :row="row" :index="$index" /><!-- 自定义slot (START) --><slot v-else-if="col.slot" name="expand" :row="row" :index="$index"></slot></template></el-table-column><el-table-column v-else-if="col.type === 'index' && (col.hideFlag || col.hideFlag == null)" :index="indexMethod" v-bind="{ type: 'index', width: '50', label: $t(col.label + '') }" width="65"><!-- 当type等于expand时, 配置通过h函数渲染、txs语法或者插槽自定义内容 --><template #default="{ row, $index }"><!-- render函数 (START) : 使用内置的component组件可以支持h函数渲染和txs语法 --><component v-if="col.render" :is="col.render" :row="row" :index="$index" /><!-- 自定义slot (START) --><slot v-else-if="col.slot" name="expand" :row="row" :index="$index"></slot></template></el-table-column><!-- 渲染插槽 START --><TableColumn :col="col" v-else-if="col.hideFlag || col.hideFlag == null" @command="handleAction"><template v-for="slot in  Object.keys($slots) " #[slot]="scope: Record<string, any>"><slot :name=" slot " v-bind=" scope " /></template></TableColumn><!-- 渲染插槽 END --></template><template #empty><div class="mp_tatble_nodata"><img class="active-daek" :src=" ImageUrl " alt=""><div>{{$t('message.application.btn.currently')}}</div></div></template></el-table><!-- 分页器 --><div v-if=" _options.showPagination " class="mt20"><el-pagination v-bind=" _paginationConfig " @size-change=" pageSizeChange " @current-change=" currentPageChange " /></div></div>
</template>
<script lang="ts" setup>import { ComputedRef, computed, ref, onMounted, defineAsyncComponent, withDefaults } from 'vue';import type { TableColumnCtx } from 'element-plus/es/components/table/src/table-column/defaults';import { ElTable } from 'element-plus';import ImageUrl from '/@/assets/nodata.png'const TableColumn = defineAsyncComponent(() => import('./TableColumn.vue'));export type SortParams<T> = {column: TableColumnCtx<T | any>;prop: string;order: Table.Order;};interface TableProps {tableData: Array<object>; // table的数据columns: Table.Column[]; // 每列的配置项options?: Table.Options;fullLoading?: boolean;}const props = withDefaults(defineProps<TableProps>(), {fullLoading: false,});const tableRef = ref<InstanceType<typeof ElTable>>();// 设置option默认值,如果传入自定义的配置则合并option配置项const _options: ComputedRef<Table.Options> = computed(() => {const option = {stripe: false,tooltipEffect: 'dark',showHeader: true,showPagination: false,rowStyle: () => 'cursor:pointer', // 行样式};return Object.assign(option, props?.options);});// 合并分页配置const _paginationConfig = computed(() => {const config = {total: 0,currentPage: 1,pageSize: 10,pageSizes: [10, 20, 50],layout: 'total, sizes, prev, pager, next, jumper'}return Object.assign(config, _options.value.paginationConfig)})const emit = defineEmits(['selection-change', // 当选择项发生变化时会触发该事件'row-click', // 当某一行被点击时会触发该事件'cell-click', // 当某个单元格被点击时会触发该事件'command', // 按钮组事件'size-change', // pageSize事件'current-change', // currentPage按钮组事件'pagination-change', // currentPage或者pageSize改变触发'sort-change', // 列排序发生改变触发'row-radio', // 单选]);// 自定义索引const indexMethod = (index: number) => {const tabIndex = index + (_paginationConfig.value.currentPage - 1) * _paginationConfig.value.pageSize + 1;return tabIndex;};// 切换pageSizeconst pageSizeChange = (pageSize: number) => {emit('size-change', pageSize);emit('pagination-change', 1, pageSize);};// 切换currentPageconst currentPageChange = (currentPage: number) => {emit('current-change', currentPage);emit('pagination-change', currentPage, _paginationConfig.value.pageSize);};// 按钮组事件const handleAction = (command: Table.Command, row: any, index: number) => {emit('command', command, row, index);};// 多选事件const handleSelectionChange = (val: any) => {emit('selection-change', val);};//返回当前选中的行const getSelectionRows = () => {return tableRef.value?.getSelectionRows();};// 当某一行被点击时会触发该事件const handleRowClick = (row: any, column: any, event: MouseEvent) => {emit('row-click', row, column, event);};// 当某个单元格被点击时会触发该事件const handleCellClick = (row: any, column: any, cell: any, event: MouseEvent) => {if (column && column.className) {if (column.className == 'mp-highlight') {emit('cell-click', row, column, cell, event);}}if (_options.value.showRadio) {if (tableRef.value && tableRef.value) tableRef.value.setCurrentRow(row)emit('row-radio', row, column, cell, event);}};/***  当表格的排序条件发生变化的时候会触发该事件* 在列中设置 sortable 属性即可实现以该列为基准的排序, 接受一个 Boolean,默认为 false。* 可以通过 Table 的 default-sort 属性设置默认的排序列和排序顺序。* 如果需要后端排序,需将 sortable 设置为 custom,同时在 Table 上监听 sort-change 事件,* 在事件回调中可以获取当前排序的字段名和排序顺序,从而向接口请求排序后的表格数据。*/const handleSortChange = ({ column, prop, order }: SortParams<any>) => {emit('sort-change', { column, prop, order });};// 暴露给父组件参数和方法,如果外部需要更多的参数或者方法,都可以从这里暴露出去。defineExpose({ element: tableRef, fn: getSelectionRows });
</script>
<style lang="scss" scoped>
:deep(.el-image__inner) {transition: all 0.3s;cursor: pointer;&:hover {transform: scale(1.2);}
}.el-table-box {height: 100%;.isActive {height: calc(100% - 45px) !important;}.active {height: 100%;}.mt20 {display: flex;justify-content: end;}
}</style>

4. 安装 cnpm i -S dayjs (可以不安装 ,如果不安装就删除下面的标记部分)

 // TableColumn.vue<script lang="ts" setup>import dayjs from 'dayjs'defineProps<{ col: Table.Column }>()const emit = defineEmits(['command', 'handleClickRow'])// 按钮组事件const handleAction = (command: Table.Command, { row, $index }: { row: any; $index: number }) => {emit('command', command, row, $index)}
</script>
<template><!-- 如果有配置多级表头的数据,则递归该组件 --><template v-if="col.children?.length"><el-table-column :label="col.label" :width="col.width" :align="col.align"><TableColumn v-for="item in     col.children    " :col="item" :key="item.prop"><template v-for="slot in     Object.keys($slots)    " #[slot]="scope: Record<string, any>"><slot :name=" slot " v-bind=" scope " /></template></TableColumn><template #header=" { column, $index } "><component v-if=" col.headerRender " :is="col.headerRender" :column=" column " :index=" $index " /><slot v-else-if=" col.headerSlot " :name=" col.headerSlot " :column=" column " :index=" $index "></slot><span v-else>{{ $t(column.label) }}</span></template></el-table-column></template><el-table-column v-else-if=" col.highlight " v-bind=" col " class-name='mp-highlight'><template #header=" { column, $index } "><component v-if=" col.headerRender " :is="col.headerRender" :column=" column " :index=" $index " /><slot v-else-if=" col.headerSlot " :name=" col.headerSlot " :column=" column " :index=" $index "></slot><span v-else>{{ $t(column.label)}}</span></template><template #default=" { row, $index } "><span>{{ row[col.prop!] }}</span></template></el-table-column><!-- 其他正常列 --><el-table-column v-else v-bind=" col "><!-- 自定义表头 --><template #header=" { column, $index } "><component v-if=" col.headerRender " :is="col.headerRender" :column=" column " :index=" $index " /><slot v-else-if=" col.headerSlot " :name=" col.headerSlot " :column=" column " :index=" $index "></slot><span v-else>{{ $t(column.label)}}</span></template><template #default=" { row, $index } "><!-- 如需更改图片size,可自行配置参数 --><el-image v-if=" col.type === 'image' " preview-teleported :hide-on-click-modal=" true " :preview-src-list=" [row[col.prop!]] " :src=" row[col.prop!] " fit="cover" class="w-9 h-9 rounded-lg" /><!-- day.js开始  (不安装可删除该部分)  --><!--- 格式化日期 (本项目日期是时间戳,这里日期格式化可根据你的项目来更改) (START)--><template v-else-if=" col.type === 'date' "><!---十位数时间戳--><span v-if=" String(row[col.prop!])?.length <= 10 ">{{ dayjs.unix(row[col.prop!]).format(col.dateFormat ?? 'YYYY-MM-DD') }}</span><!---十三位数时间戳--><span v-else>{{ dayjs(row[col.prop!]).format(col.dateFormat ?? 'YYYY-MM-DD') }}</span></template><!-- day.js结束  --><!-- 如果传递按钮数组,就展示按钮组 START--><el-button-group v-else-if=" col.buttons?.length "><el-button v-for="(    btn, index    ) in     col.buttons    " :key=" index " :size=" btn.size " :type=" btn.type " @click="handleAction(btn.command, { row, $index })">{{ btn.name }}</el-button></el-button-group><!-- render函数 (START) 使用内置的component组件可以支持h函数渲染和txs语法--><component v-else-if=" col.render " :is="col.render" :row=" row " :index=" $index " /><!-- 自定义slot (START) --><slot v-else-if=" col.slot " :name=" col.slot " :row=" row " :index=" $index "></slot><!-- 默认渲染 (START)  --><span v-else>{{ row[col.prop!] }}</span></template></el-table-column>
</template>

5. table.d.ts (表格全局接口文件)

// table.d.ts
declare namespace Table {type VNodeChild = import('vue').VNodeChildtype Type = 'selection' | 'index' | 'expand' | 'image' | 'date'type Size = 'large' | 'default' | 'small'type Align = 'center' | 'left' | 'right'type Command = string | numbertype DateFormat = 'YYYY-MM-DD' | 'YYYY-MM-DD HH:mm:ss' | 'YYYY-MM-DD HH:mm' | 'YYYY-MM'type Order = 'ascending' | 'descending'interface ButtonItem {name: string,command: Command,size?: Sizetype?: 'primary' | 'success' | 'warning' | 'danger' | 'info',}interface Sort {prop: stringorder: Orderinit?: anysilent?: any}interface Column {// 对应列的类型。 如果设置了selection则显示多选框; 如果设置了 index 则显示该行的索引(从 1 开始计算); 如果设置了 expand 则显示为一个可展开的按钮type?: Type | 'customCell',label?: string,prop?: string,slot?: stringwidth?: string,align?: Align,hideFlag?:boolean,hide?:boolean,fixed?:string|boolean,highlight?:boolean,//字段高亮dateFormat?: DateFormat // 显示在页面中的日期格式,简单列举了几种格式, 可自行配置showOverflowTooltip?: boolean,buttons?: ButtonItem[],render?: (row?: any, index?: number) => VNodeChild // 渲染函数,渲染这一列的每一行的单元格sortable?: boolean | 'custom', // 对应列是否可以排序, 如果设置为 'custom',则代表用户希望远程排序,需要监听 Table 的 sort-change 事件headerRender?: ({ column, index }) => VNodeChild, // 渲染函数,渲染列表头headerSlot?: string, // 自定义表头插槽名字children?: Column[] // 配置多级表头的数据集合, 具体用法可参考多级表头使用示例。}interface Options {height?: string | number,// Table 的高度, 默认为自动高度。 如果 height 为 number 类型,单位 px;如果 height 为 string 类型,则这个高度会设置为 Table 的 style.height 的值,Table 的高度会受控于外部样式。stripe?: boolean, // 是否为斑马纹 tablemaxHeight?: string | number, // Table 的最大高度。 合法的值为数字或者单位为 px 的高度。size?: Size // Table 的尺寸showHeader?: boolean // 是否显示表头,showRadio?:boolean, //单选showCheckout?:boolean, //多选defaultExpandAll?:booleantooltipEffect?: 'dark' | 'light' // tooltip effect 属性showPagination?: boolean, // 是否展示分页器paginationConfig?: Pagination, // 分页器配置项,详情见下方 paginationConfig 属性,rowStyle?: ({ row, rowIndex }) => stirng | object // 行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style。headerCellStyle?: import('vue').CSSProperties, // 表头单元格的style样式,是一个object为所有表头单元格设置一样的 Style。注:CSSProperties类型就是一个对象,像正常在style中写css一样 {color: #f00}defaultSort?: Sort // 默认的排序列的 prop 和顺序。 它的 prop 属性指定默认的排序的列,order 指定默认排序的顺序。"row-key"?: string // 行数据的 Key,用来优化 Table 的渲染。treeProps?:{}}interface Pagination {total?: number, // 总条目数currentPage: number, // 当前页数,支持 v-model 双向绑定pageSize: number, // 每页显示条目个数,支持 v-model 双向绑定pageSizes?: number[], // 每页显示个数选择器的选项设置layout?: string, // 组件布局,子组件名用逗号分隔background?: boolean // 是否为分页按钮添加背景色}interface pagination_type {currentPage: number,limit: number,}
}

6. 简单使用 具体的使用方法可以在 table.d.ts (表格全局接口文件) 中查看配置

<template><div class="mp-box-container layout-pd user-news-center"><Table :columns="tableColumn" v-loading="state.fullLoading" :options="state.options":table-data="state.tableData" @pagination-change="paginationChange"@sort-change="handleSortChange"><!-- 操作 --><template #action="{ row, index }"><div class="user-news-center__btns"><el-button type="primary" link @click="editNewsHandler(row)">{{ $t('编辑') }}</el-button><el-button type="primary" link @click="deleteNewsHander(row)">{{ $t('删除') }}</el-button></div></template></Table></div>
</template><script setup lang="ts">
import { defineAsyncComponent, ref, reactive, onMounted, h, watch } from 'vue' // vue实例
const Table = defineAsyncComponent(() => import('/@/custom/myTable/index.vue')) // 引入组件// 分页
const paginationConfig = reactive({total: 0,currentPage: 1,pageSize: 10,
})// 排序
const orderConfig = reactive({prop: '',order: '',
})let state = reactive({options: { showPagination: true,paginationConfig,},tableData: [],tableColumn: [],fullLoading: false
})const tableColumn = ref<Table.Column[]>([// 公司编码{prop: 'F_EnCode',hideFlag: true,label: '公司编码',width: '150px',showOverflowTooltip: true},// 公司名称{prop: 'F_FullName',label: '公司名称',// highlight: true,  //字段高亮hideFlag: true, //显隐},// 上级公司{prop: 'F_ParentName',label: '上级公司',// highlight: true,  //字段高亮hideFlag: true, //显隐},// 备注{prop: 'F_Description',label: '备注',// highlight: true,  //字段高亮hideFlag: true, //显隐},// 按钮使用render函数渲染(操作){width: '120',label: 'message.publicTable.Operation',prop: 'action',slot: 'action',  // 方法一  插槽fixed: "right",// 方法二 按钮组// buttons:[// 	{// 		name:"编辑",// 		command:"edit",// 		type:"danger"// 	},// 	{// 		name:"删除",// 		command:"delete",// 		type:"danger"// 	}// ]/**    * * 方法三 render 函数* */// render: (row: User, index: number) =>// 	// 渲染单个元素// 	h('div', null, [// 		h(// 			ElButton,// 			{// 				type: 'primary',// 				link: true,// 				onClick: () => handleRenderEdit(row, index)// 			},// { default: () => '编辑' }// 		),// 		h(// 			ElButton,// 			{// 				type: 'primary',// 				link: true,// 				onClick: () => handleRenderDelete(row, index)// 			},// 			{ default: () => '删除' }// 		)// 	])}
])/*** 删除*/
const deleteNewsHander = (row: any) => {}/*** 编辑*/
const editNewsHandler = (row: any) => {}/*** 分页改变*/
const paginationChange = (currentPage: number, pageSize: number) => {paginationConfig.currentPage = currentPage;paginationConfig.pageSize = pageSize;}/*** 排序*/
const handleSortChange = ({ prop, order }: any) => {orderConfig.order = order === 'ascending' ? 'asc' : 'desc'orderConfig.prop = prop}</script>

7. 效果
在这里插入图片描述

8. 以上为全部代码! 欢迎各位同学指导!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业机器视觉megauging(向光有光)使用说明书(十二,轻量级的visionpro)

关于最后一个工具的介绍&#xff1a;就是这个“相机图像” 我们可以鼠标双击点进去看一看&#xff1a; 在图像上点击&#xff0c;就可以截取一块图像&#xff0c;是可以放大缩小的&#xff0c;这个放大很low&#xff0c;是我以前研究缩放入门时的版本&#xff0c;本想删除&…

wordpress安装之Linux解压缩安装

本次教程是为了让大家少走弯路&#xff0c;可以更直观的去认识我们不懂的知识面。 首先我们安装解压缩的软件 命令如下&#xff1a; yum install -y unzip 上一篇我们讲到传输文件了 这篇我们把传输过来的压缩包解压并进行安装。follow me&#xff01; 我们输入命令 unzi…

BUUCTF 间谍启示录 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 在城际公路的小道上&#xff0c;罪犯G正在被警方追赶。警官X眼看他正要逃脱&#xff0c;于是不得已开枪击中了罪犯G。罪犯G情急之下将一个物体抛到了前方湍急的河流中&#xff0c;便头一歪突然倒地。警官X接近一看&…

C#网络编程(System.Net命名空间和System.Net.Sockets命名空间)

目录 一、System.Net命名空间 1.Dns类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 2.IPAddress类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 3.IPEndPoint类 &#xff08;1&#xff09; 示例源码 &#xff0…

贪心算法(新坑)

贪心入门 概述&#xff1a; 贪心算法是一种在每一步选择中都采取当前最优解的策略&#xff0c;希望最终能够得到全局最优解的算法。简单来说&#xff0c;它会不断地做出局部最优的选择&#xff0c;相信通过这种选择最终能够达到全局最优。 举个例子来说明。假设你要从一个迷…

一小时玩转【负载均衡】

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

万宾科技可燃气体监测仪科技作用全览

燃气管网在运行过程中经常会遇到燃气管道泄漏的问题&#xff0c;燃气泄漏甚至会引起爆炸&#xff0c;从而威胁人民的生命和财产安全&#xff0c;因此对燃气管网进行定期巡检是十分必要的工作。但是传统的人工巡检已不能满足城市的需要&#xff0c;除了选择增加巡检人员之外&…

微服务实战系列之Redis

前言 云淡天高&#xff0c;落木萧萧&#xff0c;一阵西北风掠过&#xff0c;似寒刀。冬天渐渐变得更名副其实了&#xff0c;“暖冬”的说法有点言过其实了。——碎碎念 微服务实战系列之Cache微服务实战系列之Nginx&#xff08;技巧篇&#xff09;微服务实战系列之Nginx微服务实…

WPF Live Charts2 自学笔记

文章目录 前言实现效果微软平台的历史问题 WPF 项目搭建Nuget添加额外框架添加项目初始化livecharts配置其它LiveCharts2 案例简单案例Demo示例ViewViewModel GPU渲染 Github地址仓库 前言 LiveChart 是C# 上面很受欢迎的统计图 UI控件。最近在学WPFhalcon开发&#xff0c;想想…

【动态规划】LeetCode2552:优化了6版的1324模式

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划 本题其它解法 C前缀和算法的应用&#xff1a;统计上升四元组 类似题解法 包括题目及代码C二分查找算法&#xff1a;132 模式解法一枚举3C二分查找算法&am…

设计模式---第五篇

系列文章目录 文章目录 系列文章目录前言一、知道观察者模式吗?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、知道观察者模式吗? 答:观察者模式是定义对…

阿里系列-淘宝接口抓取及相关问题

阿里系-淘宝接口抓取 一、安装charlse抓包工具 官方下载地址 安装证书 二、安装xposed hook框架 Xponsed简介 具体安装步骤 三、安装模块 关闭阿里系ssl验证 开启http模式 支持支付宝、淘宝、淘宝直播各个接口抓取 四、效果如下 接下去一段时间更新阿里系相关接口 文章目录 一、…

OSG编程指南<十四>:OSG纹理渲染之普通纹理、多重纹理、Mipmap多级渐远纹理及TextureRectangle矩阵纹理

1、纹理映射介绍 物体的外观不仅包括形状&#xff0c;不同物体表面有着不同的颜色和图案。一个简单而有效地实现这种特性的方法就是使用纹理映射。在三维图形中&#xff0c;纹理映射&#xff08;Texture Mapping&#xff09;的方法运用广泛&#xff0c;使用该技术可以大大提高物…

VUE语法--img图片不显示/img的src动态赋值图片显示

1、问题概述 常见情景1&#xff1a;在VUE中使用img显示图片的时候&#xff0c;通过传参的方式传入图片的路径和名称&#xff0c;VUE不加载本地资源而是通过http://localhost:8080/...的地址去加载网络资源&#xff0c;从而出现了图片无法显示的情况。 常见情景2&#xff1a;针…

W2311294-万宾科技可燃气体监测仪怎么进行数据监测

万宾科技可燃气体监测仪怎么进行数据监测 燃气是现代城市之中重要的能源&#xff0c;它已经渗透到城市生活的方方面面&#xff0c;对燃气管网的管理也在考验着政府人员的工作能力。燃气管网的安全运行和城市的安全和人民的生活直接挂钩。为了及时掌握燃气管网的运行状态&#x…

Nvidia VPI 双目相机生成深度图

nVidia VPI&#xff08;Vision Programming Interface&#xff09;提供了多种后端&#xff0c;用于执行图像处理和计算机视觉操作。不同的后端针对不同的硬件和用例进行了优化。这些后端包括&#xff1a; 1. CPU: 这是最通用的后端&#xff0c;它运行在标准的中央处理器&#…

字符函数 和 字符串函数

今天我打算介绍一些字符函数和字符串函数&#xff0c;有一些字符串函数我实现了模拟&#xff0c;但文章中没有放出来&#xff0c;如果需要的欢迎来到我的gitee里面拿取&#xff08;在test.c11-23里面&#xff09; 这是我的gitee:小汐 (lhysxx) - Gitee.com 字符函数 1. islow…

Vivado版本控制

Vivado版本控制 如果您有幸进入FPGA领域&#xff0c;那么会遇到版本控制问题&#xff0c;本文讲解的是如何用git进行Vivado进行版本控制。 搭建Git环境 一 首先需要一个git环境&#xff0c;并选择一个托管平台&#xff08;github,gitlab,gitee&#xff09; Git下载地址&…

Kubernetes学习笔记-Part.09 K8s集群构建

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第九章 K8s集群构建 9.1.集群初始化 集群初始化是首…

java+springboot校园一卡通学生卡管理系统+jsp

利用校园卡实现了学生在学校的身份认证&#xff0c;对学生在学校的各种消费提供了方便的途径。对于学校图书馆&#xff0c;将自动存储学生图书借阅情况&#xff0c;记录处罚情况.对于任课教师可以及时、准确、方便的了解学生出勤、作业等情况。是凭借发达的网络技术&#xff0c…