el-table 組件實現 “合并單元格 + N行數據小計” 功能

目錄

  • 需求 - 要實現的效果
  • 初始代碼
  • 代碼升級(可供多個表格使用)
    • `CommonTable.vue 子組件 `
    • 使用子組件1 - `父組件 - 圖1~圖3使用`
      • 效果展示
    • 使用子組件2 - `父組件 - 圖4使用`
      • 效果展示
  • 注意
  • 【代碼優化 - 解決bug】

需求 - 要實現的效果

在這里插入圖片描述

父組件中 info 數據示例

const info = {itemMap: {警告: [{total: 28,cfzl: '1',cfzlView: '警告',wfxl: '12',wfxlView: '超速行駛',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 3,cfzl: '1',cfzlView: '警告',wfxl: '17',wfxlView: '未低速通過',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 6,cfzl: '1',cfzlView: '警告',wfxl: '26',wfxlView: '違法停車',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 21,cfzl: '1',cfzlView: '警告',wfxl: '28',wfxlView: '違法裝載',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 3,cfzl: '1',cfzlView: '警告',wfxl: '49',wfxlView: '其他影響安全行為',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 1,cfzl: '1',cfzlView: '警告',wfxl: '28',wfxlView: '違法裝載',jtfs: 'B21',jtfsView: '中型欄板半掛車'}],罰款: [{total: 56,cfzl: '2',cfzlView: '罰款',wfxl: '12',wfxlView: '超速行駛',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 6,cfzl: '2',cfzlView: '罰款',wfxl: '17',wfxlView: '未低速通過',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 12,cfzl: '2',cfzlView: '罰款',wfxl: '26',wfxlView: '違法停車',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 42,cfzl: '2',cfzlView: '罰款',wfxl: '28',wfxlView: '違法裝載',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 6,cfzl: '2',cfzlView: '罰款',wfxl: '49',wfxlView: '其他影響安全行為',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{total: 2,cfzl: '2',cfzlView: '罰款',wfxl: '28',wfxlView: '違法裝載',jtfs: 'B21',jtfsView: '中型欄板半掛車'}]},columns: [{// total: 28,// cfzl: '1',// cfzlView: '警告',// wfxl: '12',// wfxlView: '超速行駛',jtfs: 'B11',jtfsView: '重型欄板半掛車'},{// total: 1,// cfzl: '1',// cfzlView: '警告',// wfxl: '28',// wfxlView: '違法裝載',jtfs: 'B21',jtfsView: '中型欄板半掛車'}]
}

初始代碼

父組件

<!-- info 數據來源 → info 數據示例 -->
<CommonTable :info="info"/>

CommonTable.vue 子組件

<template><el-table:data="tableData"borderstripemax-height="400"size="mini":span-method="firstColMergeSpan"><el-table-column align="center" prop="cfzl" label="處罰種類" /><el-table-column align="center" prop="wfxwfl" label="違法行為分類" /><el-table-columnv-for="(item, index) in columns":key="index"align="center":prop="item.jtfs":label="item.jtfsView || '-'"><template slot-scope="{ row, $index }"><span>{{ row[item.jtfs] | noDataFilter }}</span></template></el-table-column><el-table-column align="center" prop="xj" label="小計" /></el-table>
</template><script>
export default {name: 'CommonTable',components: {},props: {info: {type: Object,required: true}},data() {return {spanArr: []}},computed: {tableData() {const list = []Object.entries(this.info?.itemMap || {}).forEach((i) => {i[1]?.forEach((ii) => {list.push({// cfzl: ii.cfzlView,cfzl: i[0],wfxwfl: ii.wfxlView,[ii.jtfs]: ii.total,jtfs: ii.jtfs})})})return list.map((item) => {return {...item,xj: this.columnKeyList.reduce((a, b) => {return a + (item[b] || 0)}, 0)}})},columns() {return this.info.columns || []},columnKeyList() {return this.columns.map((item) => item.jtfs)}},watch: {info() {this.xjPosition()this.firstColMergeCount()}},created() {},methods: {// 計算小計行插入位置xjPosition(Human = this.tableData) {const doctorMap = {}for (let i = 0; i < Human.length; i++) {// 找出相同名稱的行數const doctorName = Human[i].cfzlif (doctorMap[doctorName] !== undefined) {doctorMap[doctorName].push(i)} else {doctorMap[doctorName] = [i]}}const keyArr = []for (const k in doctorMap) {// 取出key并倒序,防止正序插入會影響行下標keyArr.unshift(k)}keyArr.forEach((ele, index) => {const lastIndex = doctorMap[ele][doctorMap[ele].length - 1] // 找出相同名稱最后一行插入合計數據const obj = this.xjRowDataCalc(Human, ele) // 計算出小計行數據Human.splice(lastIndex + 1, 0, obj) // 插入})},// 小計行計算xjRowDataCalc(data, name) {const obj = {cfzl: name, // 第一列用于合并單元格wfxwfl: '小計'}this.columnKeyList.forEach((key) => {obj[key] = 0})data.forEach((item) => {// “處罰種類” 相同的加起來if (item.cfzl === name) {this.columnKeyList.forEach((key) => {obj[key] += Number(item[key] || 0)})}})obj.xj = this.columnKeyList.reduce((a, b) => {return a + (obj[b] || 0)}, 0)return obj},// 合并單元格firstColMergeSpan({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) {const _row = this.spanArr[rowIndex]const _col = _row > 0 ? 1 : 0return {rowspan: _row,colspan: _col}}},// 計算要合并的單元格firstColMergeCount() {let contactDot = 0this.spanArr = []this.tableData.forEach((item, index) => {item.index = indexif (index === 0) {this.spanArr.push(1)} else {// 根據相同 “處罰種類” 來合并if (item.cfzl === this.tableData[index - 1].cfzl) {this.spanArr[contactDot] += 1this.spanArr.push(0)} else {contactDot = indexthis.spanArr.push(1)}}})}}
}
</script><style lang='scss' scoped>
</style>

代碼升級(可供多個表格使用)

圖1
在這里插入圖片描述
圖2
在這里插入圖片描述
圖3
在這里插入圖片描述
圖4
在這里插入圖片描述

根據接口返回數據不同(數據格式一致,只是部分字段名不一致),向子組件傳入不同的字段名。

CommonTable.vue 子組件

<template><el-table:data="tableData"borderstripemax-height="400"size="mini":span-method="firstColMergeSpan"><!-- 第一列 --><el-table-column align="center" :prop="oneColPropField" :label="oneColLabelField" /><!-- 第二列 --><el-table-column align="center" :prop="twoColPropField" :label="twoColLabelField" /><!-- 其他數量列 --><el-table-columnv-for="(item, index) in columns":key="index"align="center":prop="item[countColPropsField]":label="item[countColLabelField] || '-'"><template slot-scope="{ row, $index }"><span>{{ row[item[countColPropsField]] | noDataFilter }}</span></template></el-table-column><!-- “小計”列 --><el-table-column align="center" prop="xj" label="小計" /></el-table>
</template><script>
export default {name: 'CommonTable',components: {},props: {info: {type: Object,required: true},// 自定義表格列selfColumns: {type: Array,default: () => []},// 表格列非自定義時(接口獲取)列字段名columnKeyField: {type: String,default: 'jtfs'},// 第一列字段名oneColPropField: {type: String,required: true},// 第一列展示header文本oneColLabelField: {type: String,required: true},// 第一列數據來源字段名oneColDataField: {type: String,required: true},// 第二列字段名twoColPropField: {type: String,required: true},// 第二列展示header文本twoColLabelField: {type: String,required: true},// 第二列數據來源字段名twoColDataField: {type: String,required: true},// 其他數量 列 字段名countColPropsField: {type: String,default: 'jtfs'},// 其他數量 列 展示header文本字段名countColLabelField: {type: String,default: 'jtfsView'},// 其他數量 列 數據來源字段名countColDataField: {type: String,default: 'total'}},data() {return {spanArr: []}},computed: {// 表格數據處理tableData() {const list = []Object.entries(this.info?.itemMap || {}).forEach((i) => {i[1]?.forEach((ii) => {list.push({// [this.oneColPropField]: ii[this.oneColDataField] // 第一列數據(第一列數據部分表格 ii 中無第一列數據,所以使用↓↓↓下一行代碼 i[0] 取第一列數據)[this.oneColPropField]: i[0], // 第一列數據[this.twoColPropField]: ii[this.twoColDataField], // 第二列數據[ii[this.countColPropsField]]: ii[this.countColDataField] // 其他數量列數據// jtfs: ii.jtfs})})})return list.map((item) => {return {...item,// 計算小計數量xj: this.columnKeyList.reduce((a, b) => {return a + (item[b] || 0)}, 0)}})},columns() {/*** 表格列獲取*    父組件有傳表格列 selfColumns 就用 selfColumns*    否則用接口獲的表格列*/return (this.selfColumns.length && this.selfColumns) || this.info.columns || []},columnKeyList() {// 獲取表格每列字段名組成數組return this.columns.map((item) => item[this.columnKeyField])}},watch: {info() {this.xjPosition()this.oneColMergeCount()}},created() {},methods: {// 計算小計行插入位置xjPosition(Human = this.tableData) {const doctorMap = {}for (let i = 0; i < Human.length; i++) {// 找出相同名稱的行數const doctorName = Human[i][this.oneColPropField]if (doctorMap[doctorName] !== undefined) {doctorMap[doctorName].push(i)} else {doctorMap[doctorName] = [i]}}const keyArr = []for (const k in doctorMap) {// 取出key并倒序,防止正序插入會影響行下標keyArr.unshift(k)}keyArr.forEach((ele, index) => {const lastIndex = doctorMap[ele][doctorMap[ele].length - 1] // 找出相同名稱最后一行插入合計數據const obj = this.xjRowDataCalc(Human, ele) // 計算出小計行數據Human.splice(lastIndex + 1, 0, obj) // 插入})},// 小計行數據計算xjRowDataCalc(data, name) {const obj = {[this.oneColPropField]: name, // 第一列用于合并單元格[this.twoColPropField]: '小計' // 第二列數據}this.columnKeyList.forEach((key) => {obj[key] = 0 // 其他書兩列數據})data.forEach((item) => {// 第一列 oneColPropField 數據相同的加起來if (item[this.oneColPropField] === name) {this.columnKeyList.forEach((key) => {obj[key] += Number(item[key] || 0)})}})// 小計列數據總和(小計行和小計列交匯處數據)obj.xj = this.columnKeyList.reduce((a, b) => {return a + (obj[b] || 0)}, 0)return obj},// 合并單元格firstColMergeSpan({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) {const _row = this.spanArr[rowIndex]const _col = _row > 0 ? 1 : 0return {rowspan: _row,colspan: _col}}},// 計算要合并的單元格oneColMergeCount() {let contactDot = 0this.spanArr = []this.tableData.forEach((item, index) => {item.index = indexif (index === 0) {this.spanArr.push(1)} else {// 第一列相同的合并if (item[this.oneColPropField] === this.tableData[index - 1][this.oneColPropField]) {this.spanArr[contactDot] += 1this.spanArr.push(0)} else {contactDot = indexthis.spanArr.push(1)}}})}}
}
</script><style lang='scss' scoped>
</style>

使用子組件1 - 父組件 - 圖1~圖3使用

<!-- info 數據來源 → info 數據示例 -->
<CommonTable:info="info"one-col-prop-field="cfzl"one-col-label-field="處罰種類"one-col-data-field="cfzlView"two-col-prop-field="wfxwfl"two-col-label-field="違法行為分類"two-col-data-field="wfxlView"
/>

效果展示

在這里插入圖片描述

使用子組件2 - 父組件 - 圖4使用

<CommonTable:info="info"one-col-prop-field="cfzl"one-col-label-field="處罰種類"one-col-data-field="cfzlView"two-col-prop-field="wfxwfl"two-col-label-field="違法行為分類"two-col-data-field="wfxlView"column-key-field="timenum"count-col-props-field="timenum"count-col-label-field="label":self-columns="columns"
/><script>export default {data() {return {columns: [...Array(24).keys()].map((item) => {return {timenum: `${item}`,label: `${item}-${item + 1}`}}),info: {itemMap: {警告: [{timenum: 17,total: 9,cfzl: '1',cfzlView: '警告',wfxl: '69',wfxlView: '其他影響安全行為',jtfs: null,jtfsView: null},{timenum: 17,total: 3,cfzl: '1',cfzlView: '警告',wfxl: '58',wfxlView: '違法上道路行駛',jtfs: null,jtfsView: null}]},columns: []}}}}
</script>

效果展示

在這里插入圖片描述

注意

  • 使用子組件1 和 使用子組件2 中 info 數據不同

【代碼優化 - 解決bug】

解決數據重復問題
在這里插入圖片描述

在這里插入圖片描述

<template><el-table:data="tableData"borderstripemax-height="400"size="mini":span-method="firstColMergeSpan"><!-- 第一列 --><el-table-column align="center" :prop="oneColPropField" :label="oneColLabelField" /><!-- 第二列 --><el-table-column align="center" :prop="twoColPropField" :label="twoColLabelField" /><!-- 其他數量列 --><el-table-columnv-for="(item, index) in columns":key="index"align="center":prop="item[countColPropsField]":label="item[countColLabelField] || '-'"><template slot-scope="{ row, $index }"><span>{{ row[item[countColPropsField]] | noDataFilter }}</span></template></el-table-column><!-- “小計”列 --><el-table-column align="center" prop="xj" label="小計" /></el-table>
</template><script>
export default {name: 'CommonTable',components: {},props: {info: {type: Object,required: true},// 自定義表格列selfColumns: {type: Array,default: () => []},// 表格列非自定義時(接口獲取)列字段名columnKeyField: {type: String,default: 'jtfs'},// 第一列字段名oneColPropField: {type: String,required: true},// 第一列展示header文本oneColLabelField: {type: String,required: true},// 第一列數據來源字段名oneColDataField: {type: String,required: true},// 第二列字段名twoColPropField: {type: String,required: true},// 第二列展示header文本twoColLabelField: {type: String,required: true},// 第二列數據來源字段名twoColDataField: {type: String,required: true},// 其他數量 列 字段名countColPropsField: {type: String,default: 'jtfs'},// 其他數量 列 展示header文本字段名countColLabelField: {type: String,default: 'jtfsView'},// 其他數量 列 數據來源字段名countColDataField: {type: String,default: 'total'}},data() {return {spanArr: []}},computed: {// 表格數據處理tableData() {const list = []Object.entries(this.info?.itemMap || {}).forEach((i) => {i[1]?.forEach((ii) => {/** ** 解決數據重復問題 start ****/const listDataIndex = list.findIndex((listItem) => listItem[this.twoColPropField] === ii[this.twoColDataField] )// 判斷即將要 push 進 list 的數據 是否與 list 中已有數據的第二列數據有重復,有重復的話,就在 list 中重復的第二列數據的行數據中只添加當前數據為“其他數量列數據”if (listDataIndex !== -1) {list[listDataIndex][ii[this.countColPropsField]] = ii[this.countColDataField]return}/** ** 解決數據重復問題 end ****/list.push({// [this.oneColPropField]: ii[this.oneColDataField] // 第一列數據(第一列數據部分表格 ii 中無第一列數據,所以使用↓↓↓下一行代碼 i[0] 取第一列數據)[this.oneColPropField]: i[0], // 第一列數據[this.twoColPropField]: ii[this.twoColDataField], // 第二列數據[ii[this.countColPropsField]]: ii[this.countColDataField] // 其他數量列數據// jtfs: ii.jtfs})})})return list.map((item) => {return {...item,// 計算小計數量xj: this.columnKeyList.reduce((a, b) => {return a + (item[b] || 0)}, 0)}})},columns() {/*** 表格列獲取*    父組件有傳表格列 selfColumns 就用 selfColumns*    否則用接口獲的表格列*/return (this.selfColumns.length && this.selfColumns) || this.info.columns || []},columnKeyList() {// 獲取表格每列字段名組成數組return this.columns.map((item) => item[this.columnKeyField])}},watch: {info() {this.xjPosition()this.oneColMergeCount()}},created() {},methods: {// 計算小計行插入位置xjPosition(Human = this.tableData) {const doctorMap = {}for (let i = 0; i < Human.length; i++) {// 找出相同名稱的行數const doctorName = Human[i][this.oneColPropField]if (doctorMap[doctorName] !== undefined) {doctorMap[doctorName].push(i)} else {doctorMap[doctorName] = [i]}}const keyArr = []for (const k in doctorMap) {// 取出key并倒序,防止正序插入會影響行下標keyArr.unshift(k)}keyArr.forEach((ele, index) => {const lastIndex = doctorMap[ele][doctorMap[ele].length - 1] // 找出相同名稱最后一行插入合計數據const obj = this.xjRowDataCalc(Human, ele) // 計算出小計行數據Human.splice(lastIndex + 1, 0, obj) // 插入})},// 小計行數據計算xjRowDataCalc(data, name) {const obj = {[this.oneColPropField]: name, // 第一列用于合并單元格[this.twoColPropField]: '小計' // 第二列數據}this.columnKeyList.forEach((key) => {obj[key] = 0 // 其他書兩列數據})data.forEach((item) => {// 第一列 oneColPropField 數據相同的加起來if (item[this.oneColPropField] === name) {this.columnKeyList.forEach((key) => {obj[key] += Number(item[key] || 0)})}})// 小計列數據總和(小計行和小計列交匯處數據)obj.xj = this.columnKeyList.reduce((a, b) => {return a + (obj[b] || 0)}, 0)return obj},// 合并單元格firstColMergeSpan({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) {const _row = this.spanArr[rowIndex]const _col = _row > 0 ? 1 : 0return {rowspan: _row,colspan: _col}}},// 計算要合并的單元格oneColMergeCount() {let contactDot = 0this.spanArr = []this.tableData.forEach((item, index) => {item.index = indexif (index === 0) {this.spanArr.push(1)} else {// 第一列相同的合并if (item[this.oneColPropField] === this.tableData[index - 1][this.oneColPropField]) {this.spanArr[contactDot] += 1this.spanArr.push(0)} else {contactDot = indexthis.spanArr.push(1)}}})}}
}
</script><style lang='scss' scoped>
</style>

【注】計算小計插入位置等部分方法參考文章 https://blog.csdn.net/seeeeeeeeeee/article/details/133122424

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14511.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14511.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

內網安全之證書服務基礎知識

PKI公鑰基礎設施 PKI(Public Key Infrastructure)公鑰基礎設施&#xff0c;是提供公鑰加密和數字簽名服務的系統或平臺&#xff0c;是一個包括硬件、軟件、人員、策略和規程的集合&#xff0c;用來實現基于公鑰密碼體制的密鑰和證書的產生、管理、存儲、分發和撤銷等功能。企業…

Android Debug Bridge(ADB)命令使用

引言 Android Debug Bridge&#xff08;ADB&#xff09;是一套功能強大的命令行工具&#xff0c;它為Android開發者和高級用戶提供了與Android設備通信的能力。無論是進行應用開發、測試還是執行日常設備管理任務&#xff0c;ADB都是不可或缺的工具。本文將詳細介紹一些常用的…

element-plus:踩坑日記

el-table Q&#xff1a;有fixed屬性時&#xff0c;無數據時&#xff0c;可能出現底部邊框消失的bug 現象&#xff1a; 解決方法&#xff1a; .el-table__empty-block {border-bottom: 1px solid var(--el-table-border-color); } el-collapse 折疊面板 Q&#xff1a;標題上…

云平臺的安全能力提升解決方案

提升云平臺的安全能力是確保數據和服務安全的關鍵步驟。針對大型云平臺所面臨的云上安全建設問題&#xff0c;安全狗提供完整的一站式云安全解決方案&#xff0c;充分匹配云平臺安全管理方的需求和云租戶的安全需求。協助大型云平臺建設全網安全態勢感知、統一風險管理、統一資…

加強堆(大根堆)

way&#xff1a;看上去好像就是加了個indexMap記錄節點在數組heap中的下標&#xff0c;然后就是可以查到某個元素是否在堆里并且可以進行位置的調整&#xff0c;普通的堆是沒法知道元素是不是在的&#xff0c;只能彈堆頂元素&#xff0c;插入到堆尾這樣子。如果覺得heapSize有點…

PCIE協議-4-物理層邏輯模塊

4.1 簡介 物理層將事務層和數據鏈路層與用于鏈路數據交換的信令技術隔離開來。物理層被劃分為邏輯物理層和電氣物理層子模塊&#xff08;見圖4-1&#xff09;。 4.2 邏輯物理層子模塊 邏輯子模塊有兩個主要部分&#xff1a;一個發送部分&#xff0c;它準備從數據鏈路層傳遞過…

Spring 中常用的手動裝載 bean 方法

在 Spring 的 bean 裝載條件中&#xff0c;雖然 Spring 給我們提供了非常好用便捷的 Condition 相關注解&#xff0c;但是很多時候 Condition 相關注解并不滿足我們的需求&#xff0c;我需要更復雜的條件手動控制是否裝置 bean。這個時候我們就可以實現 Spring 為我們提供的幾個…

域名DNS添加CAA記錄

目錄 概述 檢測CAA記錄 添加CAA記錄 概述 DNS CAA(Certificate Authority Authorization)記錄是一種不太常見的DNS記錄類型,它主要用于鎖定證書頒發機構(CA)列表,以確保只有特定的CA可以為某個域名頒發SSL/TLS證書。CAA記錄是保護域名免受釣魚攻擊的安全措施,通過限制…

v-md-editor和SSE實現ChatGPT的打字機式輸出

概述 不論是GPT還是文心一言&#xff0c;在回答的時候類似于打字機式的將答案呈現給我們&#xff0c;這樣的交互一方面比較友好&#xff0c;另一方面&#xff0c;當答案比較多、生成比較慢的時候也能爭取一些答案的生成時間。本文后端使用express和stream&#xff0c;使用SSE將…

Boosting Cache Performance by Access Time Measurements——論文泛讀

TOC 2023 Paper 論文閱讀筆記整理 問題 大多數現代系統利用緩存來減少平均數據訪問時間并優化其性能。當緩存未命中的訪問時間不同時&#xff0c;最大化緩存命中率與最小化平均訪問時間不同。例如&#xff1a;系統使用多種不同存儲介質時&#xff0c;不同存儲介質訪問時間不同…

【C++初階】—— 類和對象 (上)

&#x1f4dd;個人主頁&#x1f339;&#xff1a;EterNity_TiMe_ ?收錄專欄?&#xff1a;C “ 登神長階 ” &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 類和對象 1. 初步認識C2. 類的引入3. 類的定義聲明和定義全部放在類體中聲明和定義分開存放 4.…

8個實用網站和軟件,收藏起來一定不后悔~

整理了8個日常生活中經常能用得到的網站和軟件&#xff0c;收藏起來一定不會后悔~ 1.ZLibrary zh.zlibrary-be.se/這個網站收錄了超千萬的書籍和文章資源&#xff0c;國內外的各種電子書資源都可以在這里搜索&#xff0c;98%以上都可以在網站內找到&#xff0c;并且支持免費下…

Android系統的/etc/mkshrc文件

/etc/mkshrc 文件是用于配置 mksh&#xff08;MirBSD Korn Shell&#xff09;環境的啟動腳本。mksh 是 Android 默認使用的 shell&#xff0c;在 shell 啟動時會讀取并執行這個文件中的配置。以下是關于 /etc/mkshrc 文件的詳細信息及其用途。 /etc/mkshrc 文件的作用 環境配…

sql server專題實驗4 復雜查詢

SQL Server 是微軟開發的數據庫管理系統&#xff0c;它支持復雜的查詢操作&#xff0c;允許用戶從數據庫中檢索、分析和處理數據。在進行復雜查詢時&#xff0c;通常會用到以下幾種SQL語句和概念&#xff1a; 連接&#xff08;Join&#xff09;: INNER JOIN&#xff1a;只返回兩…

設計模式--備忘錄模式

備忘錄模式是一種行為設計模式&#xff0c;它用于在不破壞封裝的前提下&#xff0c;保存一個對象的內部狀態&#xff0c;以便以后可以恢復到這個狀態。這種模式在許多應用場景中非常有用&#xff0c;例如在實現撤銷操作、保存游戲進度、恢復文件備份以及保持工作狀態等。 備忘…

linux中ansible整理筆記

一、工作模式 1. adhoc臨時命令 語法&#xff1a; ansible 主機或者組列表 -m 模塊 -a “參數” 2. playbook 語法&#xff1a; ansible-playbook xxx.yml 二、模塊 1. ping 2.command:默認模塊&#xff08;不支持重定向&#xff0c;管道&#xff09; 3.shell:類似com…

IP地址顯示“不安全”怎么辦|已解決

解決IP地址顯示“不安全”的問題&#xff0c;通常需要確保網站或服務使用HTTPS協議進行加密通信&#xff0c;可以通過部署SSL證書來解決&#xff0c;以下是具體的解決步驟&#xff1a; 1 申請IP地址SSL證書&#xff1a;網站管理員應向證書頒發機構&#xff08;CA&#xff09;申…

網絡拓撲—WEB-IIS服務搭建

文章目錄 WEB-IIS服務搭建網絡拓撲配置網絡IISPC 安裝IIS服務配置IIS服務&#xff08;默認站點&#xff09;PC機訪問網頁 配置IIS服務&#xff08;新建站點&#xff09;PC機訪問網頁 WEB-IIS服務搭建 網絡拓撲 //交換機忽略不計 IIS服務IP&#xff1a;192.168.1.1 PC機IP&…

人類交互2 聽覺處理和語言中樞

人類聽覺概述 人類聽覺是指通過耳朵接收聲音并將其轉化為神經信號&#xff0c;從而使我們能夠感知和理解聲音信息的能力。聽覺是人類五種感覺之一&#xff0c;對我們的日常生活和交流至關重要。 聽覺是人類交流和溝通的重要工具。通過聽覺&#xff0c;我們能夠聽到他人的語言…

安裝錯誤提示Please run MaterialLibrary2018.msi first或者其他MaterialLibrary版本

打開autoremove&#xff0c;系統檢查&#xff0c;點擊開始檢查。檢查完成修復。 可以解決部分該問題&#xff0c;如果沒解決的請咨詢