如何基于elementui table实现自己的表格组件

水深无声 2023-06-11 06:23 107阅读 0赞

前两篇博客已经讲过如何实现,这里我把功能抽成了一个组件,这样如果有多个需要该功能的表格就可以复用了:

首先先是组件的代码:

  1. <template>
  2. <el-table
  3. v-loading="listLoading"
  4. :data="tableData"
  5. border
  6. fit
  7. size="mini"
  8. highlight-current-row
  9. style="width: 100%;margin-top: 20px"
  10. @selection-change="handleSelectionChange"
  11. @sort-change="changeSort"
  12. @header-contextmenu="rightClick"
  13. ref="filterTable"
  14. >
  15. <el-table-column
  16. type="selection"
  17. fixed="left"
  18. width="55">
  19. </el-table-column>
  20. <el-table-column type="index" align="center" width="50" fixed="left">
  21. </el-table-column>
  22. <el-table-column v-for="(item, index) in col"
  23. v-if="col[index].prop!=='select'&&col[index].prop!=='index'"
  24. align="center"
  25. :index="index"
  26. :sortable="dropCol[index].sort"
  27. show-overflow-tooltip
  28. :width="dropCol[index].width?dropCol[index].width:'200px'"
  29. :key="`col_${index}`"
  30. :fixed="dropCol[index].fixed"
  31. :prop="dropCol[index].prop"
  32. :label="item.label">
  33. <template slot-scope="scope">
  34. <span>{ { !dropCol[index].type?scope.row[dropCol[index].prop]:getValue(scope.row,dropCol[index].type),dropCol[index].prop }}</span>
  35. </template>
  36. </el-table-column>
  37. <el-table-column label="操作" align="center" fixed="right" width="200" class-name="small-padding fixed-width">
  38. <template slot-scope="scope">
  39. <el-dropdown trigger="hover">
  40. <span class="el-dropdown-link">
  41. 操作菜单<i class="el-icon-arrow-down el-icon--right"></i>
  42. </span>
  43. <el-dropdown-menu slot="dropdown">
  44. <el-dropdown-item class="el-dropdown-link" v-for="item in editData" @click.native="emitParentMethod(scope.row,item.methodName)">{ { item.name}}
  45. </el-dropdown-item>
  46. </el-dropdown-menu>
  47. </el-dropdown>
  48. </template>
  49. </el-table-column>
  50. <div v-show="menuVisible">
  51. <v-contextmenu ref="contextmenu" id="menu">
  52. <v-contextmenu-item @click="lock">锁定</v-contextmenu-item>
  53. <v-contextmenu-item @click="unlock">解锁</v-contextmenu-item>
  54. </v-contextmenu>
  55. </div>
  56. </el-table>
  57. </template>
  58. <script>
  59. import Sortable from 'sortablejs'
  60. import { mapState} from 'vuex'
  61. export default {
  62. name: "table-plus",
  63. computed: {
  64. ...mapState('d2admin/permission', [
  65. 'ownRp', 'cols', 'orders', 'allRp'
  66. ]),
  67. },
  68. data() {
  69. return {
  70. menuVisible:false,
  71. dropCol:[],
  72. col:[]
  73. }
  74. },
  75. props:{
  76. listLoading: {
  77. required: true
  78. },
  79. multipleSelection:{
  80. required:true
  81. },
  82. allCols:{
  83. required: true
  84. },
  85. colKey:{
  86. required:true //存储map的key
  87. },
  88. tableData:{
  89. required:true
  90. },
  91. editData:{
  92. required:true
  93. },
  94. },
  95. mounted(){
  96. this.columnDrop()
  97. this.col = this.getDropCol();
  98. this.dropCol = this.getDropCol();
  99. },
  100. methods:{
  101. getValue(row, type, prop) {
  102. switch (type) {
  103. case 'cluster':
  104. return row.cluster.name
  105. case 'date':
  106. return this.getDate(row[prop])
  107. case "resourcePool":
  108. return this.transRP(row.resourcePool)
  109. case "status":
  110. return this.getStatus(row.tags)
  111. }
  112. },
  113. getStatus(status) {
  114. for (let i = 0; i < status.length; i++) {
  115. let data = status[i]
  116. if (data.type === "status") {
  117. return data.value
  118. }
  119. }
  120. return "暂无状态"
  121. },
  122. transRP(id) {
  123. for (let i = 0; i < this.allRp.length; i++) {
  124. if (this.allRp[i].id === id) {
  125. return this.allRp[i].name;
  126. }
  127. }
  128. return "未知"
  129. },
  130. emitParentMethod(row,methodName){
  131. this.$emit(methodName,row);
  132. },
  133. getList(){
  134. this.$emit('getTableData')
  135. },
  136. changeSort(row) {
  137. this.sortMap = new Map();
  138. let prop = row.prop;
  139. let order = row.order;
  140. if (this.sortMap.has(prop)) {
  141. if (!order) {
  142. this.sortMap.delete(prop)
  143. } else if (order === "ascending") {
  144. this.sortMap.set(prop, "ASC")
  145. } else {
  146. this.sortMap.set(prop, "DESC")
  147. }
  148. } else {
  149. if (!order) {
  150. } else if (order === "ascending") {
  151. this.sortMap.set(prop, "ASC")
  152. } else {
  153. this.sortMap.set(prop, "DESC")
  154. }
  155. }
  156. this.getList()
  157. },
  158. getCol() {
  159. let allCols = this.allCols
  160. if (this.cols && this.cols.hasOwnProperty(this.colKey)) {
  161. if (!this.cols[this.colKey]) {
  162. return allCols;
  163. }
  164. let str = this.cols[this.colKey];
  165. let data = this.utils.str2Arr(str);
  166. let result = []
  167. result.push({ prop: "select", label: "选择"})
  168. result.push({ prop: "index", label: "序号"})
  169. data.forEach(function (item) {
  170. allCols.forEach(function (col) {
  171. if (col.prop === item) {
  172. result.push(col);
  173. }
  174. })
  175. })
  176. return result;
  177. } else {
  178. return allCols;
  179. }
  180. },
  181. getDropCol() {
  182. if (this.orders && this.orders.hasOwnProperty(this.colKey) && this.orders['device'] !== null && this.orders['device'] !== '') {
  183. return JSON.parse(this.orders[this.colKey])
  184. }
  185. return this.getCol()
  186. },
  187. handleSelectionChange(rows) {
  188. let data = [];
  189. rows.forEach(function (item) {
  190. data.push(item.id)
  191. })
  192. // this.multipleSelection = data
  193. this.$emit('update:multipleSelection', data)
  194. },
  195. //列拖拽
  196. columnDrop() {
  197. const wrapperTr = document.querySelector('.el-table__header-wrapper tr')
  198. this.sortable = Sortable.create(wrapperTr, {
  199. animation: 180,
  200. delay: 0,
  201. onEnd: evt => {
  202. const oldItem = this.dropCol[evt.oldIndex]
  203. this.dropCol.splice(evt.oldIndex, 1)
  204. this.dropCol.splice(evt.newIndex, 0, oldItem)
  205. }
  206. })
  207. },
  208. //右键点击
  209. rightClick(column, event) { // 鼠标右击触发事件
  210. document.oncontextmenu = function(){
  211. return false;
  212. }
  213. this.menuVisible = false // 先把模态框关死,目的是 第二次或者第n次右键鼠标的时候 它默认的是true
  214. this.menuVisible = true // 显示模态窗口,跳出自定义菜单栏
  215. let menu = document.querySelector('#menu')
  216. document.addEventListener('click', this.foo) // 给整个document添加监听鼠标事件,点击任何位置执行foo方法
  217. menu.style.display = "block";
  218. menu.style.left = event.clientX + 'px'
  219. menu.style.top = event.clientY + 'px'
  220. this.index=column.index
  221. },
  222. lock(){
  223. this.dropCol[this.index].fixed="left"
  224. document.oncontextmenu = function(){
  225. return true;
  226. }
  227. },
  228. unlock(){
  229. this.dropCol[this.index].fixed=false
  230. document.oncontextmenu = function(){
  231. return true;
  232. }
  233. },
  234. foo() { // 取消鼠标监听事件 菜单栏
  235. let menu = document.querySelector('#menu')
  236. this.menuVisible = false
  237. menu.style.display = "none";
  238. document.removeEventListener('click', this.foo) // 要及时关掉监听,不关掉的是一个坑,不信你试试,虽然前台显示的时候没有啥毛病,加一个alert你就知道了
  239. document.oncontextmenu = function(){
  240. return true;
  241. }
  242. },
  243. }
  244. }
  245. </script>
  246. <style>
  247. .el-dropdown-link {
  248. cursor: pointer;
  249. color: #409EFF;
  250. }
  251. .el-table--striped .el-table__body tr.el-table__row--striped.current-row td,
  252. .el-table__body tr.current-row > td {
  253. background-color: #a0cfff;
  254. }
  255. .el-table--striped .el-table__body tr.hover-row.el-table__row--striped > td,
  256. .el-table__body tr.hover-row > td {
  257. background-color: #d9ecff !important;
  258. }
  259. </style>

应用的例子:

  1. <template>
  2. <d2-container>
  3. <template slot="header">
  4. <el-form :inline="true" :model="listQuery" ref="searchForm" size="mini" style="margin-bottom: -18px;">
  5. <el-form-item>
  6. <el-button @click="search" size="mini">
  7. <d2-icon name="search"/>
  8. 搜索
  9. </el-button>
  10. </el-form-item>
  11. <el-form-item>
  12. <el-button type="primary" size="mini" icon="el-icon-circle-plus" @click="createDevice">创建资产
  13. </el-button>
  14. </el-form-item>
  15. <el-form-item>
  16. <el-button type="primary" size="mini" icon="el-icon-circle-plus" @click="changeCols">修改显示列
  17. </el-button>
  18. </el-form-item>
  19. <el-form-item>
  20. <el-button type="primary" size="mini" icon="el-icon-circle-plus" @click="addHs">添加历史变更</el-button>
  21. </el-form-item>
  22. <el-form-item>
  23. <el-button type="primary" size="mini" icon="el-icon-circle-plus" @click="saveOrder">保存显示顺序
  24. </el-button>
  25. </el-form-item>
  26. <el-form-item>
  27. <el-button type="primary" size="mini" icon="el-icon-circle-plus" @click="exportRepair">导出设备信息
  28. </el-button>
  29. </el-form-item>
  30. <el-form-item>
  31. <el-button type="primary" size="mini" icon="el-icon-circle-plus" @click="addTag">增加标签</el-button>
  32. </el-form-item>
  33. <el-form-item>
  34. <el-upload
  35. :action="deviceUrl"
  36. :show-file-list=false
  37. :on-success="handleAvatarSuccess"
  38. >
  39. <el-button size="mini" type="primary" icon="el-icon-circle-plus">
  40. 导入
  41. </el-button>
  42. </el-upload>
  43. </el-form-item>
  44. </el-form>
  45. </template>
  46. <!-- //@header-contextmenu="rightClick"-->
  47. <table-plus
  48. @cpuInfo="cpuInfo"
  49. @historyInfo="historyInfo"
  50. @editDevice="editDevice"
  51. @deleteDevice="deleteDevice"
  52. @getTableData="getList"
  53. :multipleSelection.sync="multipleSelection"
  54. :allCols="allCols"
  55. :dropCol="dropCol"
  56. colKey="device"
  57. :tableData="list"
  58. :editData="editData"
  59. :listLoading="listLoading"
  60. ref="tableData"
  61. >
  62. </table-plus>
  63. <template slot="footer">
  64. <el-pagination
  65. :current-page="page.current"
  66. :page-size="page.size"
  67. :total="page.total"
  68. :page-sizes="[1,100, 200, 300, 400]"
  69. layout="total, sizes, prev, pager, next, jumper"
  70. style="margin: -10px;"
  71. @size-change="handleSizeChange"
  72. @current-change="handleCurrentChange"
  73. >
  74. </el-pagination>
  75. </template>
  76. <el-dialog title="Device管理" :visible.sync="dialogFormVisible" :close-on-click-modal=false>
  77. <el-form :model="temp" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
  78. <el-form-item label="集群" prop="cluster">
  79. <el-select v-model="temp.clusterId" placeholder="请选择">
  80. <el-option
  81. v-for="item in clusterList"
  82. :key="item.id"
  83. :label="item.name"
  84. :value="item.id">
  85. </el-option>
  86. </el-select>
  87. </el-form-item>
  88. <el-form-item label="设备型号" prop="name">
  89. <el-input v-model="temp.name"></el-input>
  90. </el-form-item>
  91. <el-form-item label="期数" prop="period">
  92. <el-input v-model="temp.period"></el-input>
  93. </el-form-item>
  94. <el-form-item label="管理网" prop="manageIp">
  95. <el-input v-model="temp.manageIp"></el-input>
  96. </el-form-item>
  97. <el-form-item label="ILLO地址" prop="cluster">
  98. <el-input v-model="temp.illoIp"></el-input>
  99. </el-form-item>
  100. <el-form-item label="交付日期" prop="deliveryDate">
  101. <el-date-picker
  102. v-model="temp.deliveryDate"
  103. type="date"
  104. placeholder="选择日期">
  105. </el-date-picker>
  106. </el-form-item>
  107. <el-form-item label="服务器分类" prop="type">
  108. <el-input v-model="temp.type"></el-input>
  109. </el-form-item>
  110. <el-form-item label="设备类型" prop="deviceType">
  111. <el-select v-model="temp.deviceType" placeholder="请选择">
  112. <el-option
  113. v-for="item in deviceTypeList"
  114. :key="item.deviceType"
  115. :label="item.nameZh"
  116. :value="item.deviceType">
  117. </el-option>
  118. </el-select>
  119. </el-form-item>
  120. <el-form-item label="所属资源池" prop="resourcePool">
  121. <el-select v-model="temp.resourcePool" filterable placeholder="请选择">
  122. <el-option
  123. v-for="item in allRp"
  124. :key="item.id"
  125. :label="item.name"
  126. :value="item.id">
  127. </el-option>
  128. </el-select>
  129. </el-form-item>
  130. <el-form-item label="设备序列号" prop="sn">
  131. <el-input v-model="temp.sn"></el-input>
  132. </el-form-item>
  133. <el-form-item label="项目名称" prop="tag">
  134. <tag-select type="program" :value.sync="temp.tag"></tag-select>
  135. </el-form-item>
  136. <el-form-item label="机架位置" prop="position">
  137. <el-input v-model="temp.position"></el-input>
  138. </el-form-item>
  139. <el-form-item label="机房位置" prop="computerPosition">
  140. <el-input v-model="temp.computerPosition"></el-input>
  141. </el-form-item>
  142. <el-form-item label="公网" prop="publicIp">
  143. <el-input v-model="temp.publicIp"></el-input>
  144. </el-form-item>
  145. <el-form-item label="存储外网" prop="inIp">
  146. <el-input v-model="temp.outIp"></el-input>
  147. </el-form-item>
  148. <el-form-item label="CN2" prop="cn2Ip">
  149. <el-input v-model="temp.cn2Ip"></el-input>
  150. </el-form-item>
  151. <el-form-item label="系统版本" prop="systemVersion">
  152. <el-input v-model="temp.systemVersion"></el-input>
  153. </el-form-item>
  154. <el-form-item label="内核版本" prop="osVersion">
  155. <el-input v-model="temp.osVersion"></el-input>
  156. </el-form-item>
  157. <el-form-item label="用途" prop="use">
  158. <el-input v-model="temp.use"></el-input>
  159. </el-form-item>
  160. <el-form-item label="备注" prop="remarks">
  161. <el-input v-model="temp.remarks"></el-input>
  162. </el-form-item>
  163. </el-form>
  164. <div slot="footer" class="dialog-footer">
  165. <el-button type="primary" @click="saveDevice('ruleForm')">提交</el-button>
  166. <el-button @click="resetDeviceForm('ruleForm')">取消</el-button>
  167. </div>
  168. </el-dialog>
  169. <el-dialog title="硬件信息" :visible.sync="CPUVisible" width="80%">
  170. <el-collapse v-model="collapse">
  171. <el-collapse-item title="CPU信息" name="1">
  172. <cpu :device_type.sync="deviceType"></cpu>
  173. </el-collapse-item>
  174. <el-collapse-item title="内存信息" name="2">
  175. <memory :device_type.sync="deviceType"></memory>
  176. </el-collapse-item>
  177. <el-collapse-item title="硬盘信息" name="3">
  178. <disk :device_type.sync="deviceType"></disk>
  179. </el-collapse-item>
  180. <el-collapse-item title="网卡信息" name="4">
  181. <nic :device_type.sync="deviceType"></nic>
  182. </el-collapse-item>
  183. </el-collapse>
  184. </el-dialog>
  185. <!-- <el-dialog title="内存信息" :visible.sync="MemoryVisible" width="80%">-->
  186. <!-- <memory :device_type.sync="deviceType"></memory>-->
  187. <!-- </el-dialog>-->
  188. <!-- <el-dialog title="硬盘信息" :visible.sync="DiskVisible" width="80%">-->
  189. <!-- <disk :device_type.sync="deviceType"></disk>-->
  190. <!-- </el-dialog>-->
  191. <!-- <el-dialog title="网卡信息" :visible.sync="NicVisible" width="80%">-->
  192. <!-- <nic :device_type.sync="deviceType"></nic>-->
  193. <!-- </el-dialog>-->
  194. <el-dialog title="历史变更" :visible.sync="HistoryVisible" width="80%">
  195. <el-button type="primary" @click="addHistory" style="margin-bottom: 5px">添加历史变更</el-button>
  196. <el-timeline>
  197. <el-timeline-item v-for="item in history"
  198. :key="item.id"
  199. :timestamp="getDateTime(item.createDate)" placement="top">
  200. <el-card>
  201. <h4>{ { item.message}}</h4>
  202. <p>XXX 提交于 { { getDateTime(item.createDate)}}</p>
  203. </el-card>
  204. </el-timeline-item>
  205. </el-timeline>
  206. </el-dialog>
  207. <el-dialog title="显示列编辑" :visible.sync="changeVisible" width="80%">
  208. <el-transfer v-model="colsList" :data="changeData" :titles="['所有列', '显示列']"
  209. :props="{key: 'value',label: 'desc'}"
  210. ></el-transfer>
  211. <div slot="footer" class="dialog-footer">
  212. <el-button type="primary" @click="saveCols()">提交</el-button>
  213. <el-button @click="changeVisible=false">取消</el-button>
  214. </div>
  215. </el-dialog>
  216. <el-drawer
  217. title="搜索条件"
  218. :visible.sync="searchVisible"
  219. direction="rtl"
  220. size="60%"
  221. :before-close="handleClose">
  222. <el-form :model="searchForm" label-width="100px" class="demo-ruleForm">
  223. <el-row>
  224. <el-col :offset="20">
  225. <el-button @click="handleSearchFormReset" size="mini">
  226. <d2-icon name="refresh"/>
  227. 重置
  228. </el-button>
  229. </el-col>
  230. </el-row>
  231. <el-row v-for="(search,index) in searchForm">
  232. <el-col :span="8">
  233. <el-form-item label="搜索字段">
  234. <el-select v-model="search.key" filterable placeholder="请选择">
  235. <el-option
  236. v-for="item in searchData"
  237. :key="item.value"
  238. :label="item.desc"
  239. :value="item.value">
  240. </el-option>
  241. </el-select>
  242. </el-form-item>
  243. </el-col>
  244. <el-col :span="8">
  245. <el-form-item label="搜索值">
  246. <el-select v-model="search.value" v-if="search.key==='resourcePool'" filterable
  247. placeholder="请选择">
  248. <el-option
  249. v-for="item in allRp"
  250. :key="item.id"
  251. :label="item.name"
  252. :value="item.id">
  253. </el-option>
  254. </el-select>
  255. <el-select v-model="search.value" v-else-if="search.key==='deviceType'" filterable
  256. placeholder="请选择">
  257. <el-option
  258. v-for="item in deviceTypeList"
  259. :key="item.deviceType"
  260. :label="item.nameZh"
  261. :value="item.deviceType">
  262. </el-option>
  263. </el-select>
  264. <el-date-picker
  265. v-else-if="search.key==='deliveryDate'"
  266. v-model="search.value"
  267. type="date"
  268. placeholder="选择日期">
  269. </el-date-picker>
  270. <el-select v-model="search.value" v-else-if="search.key==='cluster'" filterable
  271. placeholder="请选择">
  272. <el-option
  273. v-for="item in clusterList"
  274. :key="item.id"
  275. :label="item.name"
  276. :value="item.id">
  277. </el-option>
  278. </el-select>
  279. <el-input v-else v-model="search.value"></el-input>
  280. </el-form-item>
  281. </el-col>
  282. <el-col :span="2" :offset="1">
  283. <el-button type="primary" icon="el-icon-plus" @click="addSearchInfo" circle></el-button>
  284. </el-col>
  285. <el-col :span="2">
  286. <el-button v-if="index!==0" type="danger" @click="deleteSearchInfo(index)" icon="el-icon-minus"
  287. circle></el-button>
  288. </el-col>
  289. </el-row>
  290. <el-form-item>
  291. <el-button type="primary" @click="onSearch">立即搜索</el-button>
  292. <el-button @click="searchVisible=false">取消</el-button>
  293. </el-form-item>
  294. </el-form>
  295. </el-drawer>
  296. <el-dialog title="添加标签" :visible.sync="tagVisible" width="80%">
  297. <el-form :model="tagList" status-icon ref="ruleForm" label-width="100px" class="demo-ruleForm">
  298. <el-form-item label="标签类型" prop="name">
  299. <el-select v-model="tagList.type" @change="changeType"
  300. placeholder="请选择">
  301. <el-option label="状态" value="status"></el-option>
  302. </el-select>
  303. </el-form-item>
  304. <el-form-item label="赋予的值" prop="rpId">
  305. <el-select v-model="tagList.id" filterable placeholder="请选择">
  306. <el-option
  307. v-for="item in tags"
  308. :key="item.id"
  309. :label="item.value"
  310. :value="item.id">
  311. </el-option>
  312. </el-select>
  313. </el-form-item>
  314. </el-form>
  315. <div slot="footer" class="dialog-footer">
  316. <el-button type="primary" @click="saveTag()">提交</el-button>
  317. <el-button @click="tagVisible=false">取消</el-button>
  318. </div>
  319. </el-dialog>
  320. </d2-container>
  321. </template>
  322. <script>
  323. import {
  324. fetchList,
  325. createDevice,
  326. modifyDevice,
  327. deleteDevice,
  328. addHistory,
  329. addHistories,
  330. exportRepairInfo,
  331. addTag
  332. } from '@/api/device/device' // Secondary package based on el-pagination
  333. import { findAllDeviceType} from '@/api/device/devicetype'
  334. import { findAllCluster} from '@/api/device/cluster'
  335. import { saveColsInfo, saveOrders} from '@/api/device/userInfo'
  336. import cpu from '@/components/cpu'
  337. import Memory from "@/components/memory";
  338. import Disk from "@/components/disk";
  339. import Nic from "@/components/nic";
  340. import tablePlus from "@/components/table-plus";
  341. import TagSelect from "@/components/TagSelect";
  342. import moment from "moment"
  343. import { mapState} from 'vuex'
  344. export default {
  345. name: "device",
  346. computed: {
  347. ...mapState('d2admin/permission', [
  348. 'ownRp', 'cols', 'orders', 'allRp'
  349. ]),
  350. ...mapState('d2admin/basedata', [
  351. 'tagType', 'allTags'
  352. ])
  353. },
  354. components: { Disk, Memory, cpu, Nic, TagSelect,tablePlus},
  355. data() {
  356. return {
  357. menuVisible:false,
  358. tags: [],
  359. tagList: {
  360. type: null,
  361. id: null
  362. },
  363. tagVisible: false,
  364. page: {
  365. current: 1,
  366. size: 100,
  367. total: 0
  368. },
  369. searchForm: [{
  370. key: null,
  371. value: null
  372. }],
  373. searchVisible: false,
  374. col: [],
  375. dropCol: [],
  376. rowClassName: "rowClass",
  377. cellClassName: "cellClass",
  378. deviceUrl: process.env.VUE_APP_API + "/excel/device",
  379. collapse: ["1", "2", "3", "4"],
  380. CPUVisible: false,
  381. MemoryVisible: false,
  382. DiskVisible: false,
  383. NicVisible: false,
  384. HistoryVisible: false,
  385. changeVisible: false,
  386. colsList: [],
  387. history: [],
  388. history_deviceId: null,
  389. deviceType: null,
  390. temp: {
  391. id: null,
  392. name: null,
  393. clusterId: null,
  394. use: null,
  395. deliveryDate: null,
  396. type: null,
  397. manageIp: null,
  398. illoIp: null,
  399. period: null,
  400. remarks: null,
  401. deviceType: null,
  402. resourcePool: null,
  403. sn: null,
  404. tag: null,
  405. position: null,
  406. useUser: null,
  407. startDate: null,
  408. systemVersion: null,
  409. osVersion: null,
  410. outIp: null,
  411. publicIp: null,
  412. cn2Ip: null,
  413. computerPosition: null
  414. },
  415. list: null,
  416. total: 0,
  417. listLoading: true,
  418. listQuery: {
  419. page: 1,
  420. limit: 20,
  421. searchForm: [],
  422. sortForm: null
  423. },
  424. dialogFormVisible: false,
  425. editFlag: 0,
  426. rules: {
  427. // cn2Ip: [
  428. // {required: true, message: '请输入cn2ip', trigger: 'blur'}
  429. // ],
  430. },
  431. deviceTypeList: [],
  432. clusterList: [],
  433. searchData: [
  434. { value: "resourcePool", desc: "资源池"},
  435. { value: "cluster", desc: "集群"},
  436. { value: "use", desc: "用途"},
  437. { value: "deliveryDate", desc: "交付日期"},
  438. { value: "type", desc: "服务器分类"},
  439. { value: "sn", desc: "设备序列号"},
  440. { value: "deviceType", desc: "设备类型"},
  441. { value: "name", desc: "设备型号"},
  442. { value: "status", desc: "状态"},
  443. { value: "manageIp", desc: "管理网"},
  444. { value: "illoIp", desc: "ILLO地址"},
  445. { value: "period", desc: "期数"},
  446. { value: "position", desc: "机架位置"},
  447. { value: "publicIp", desc: "公网"},
  448. { value: "cn2Ip", desc: "CN2"},
  449. { value: "outIp", desc: "存储外网"},
  450. { value: "systemVersion", desc: "系统版本"},
  451. { value: "osVersion", desc: "内核版本"},
  452. { value: "useUser", desc: "申请人"},
  453. { value: "tag", desc: "项目名称"},
  454. { value: "remarks", desc: "备注"},
  455. { value: "computerPosition", desc: "机房位置"},
  456. { value: "desc", desc: "硬件信息"},
  457. ],
  458. changeData: [
  459. { value: "name", desc: "设备类型"},
  460. { value: "cluster.name", desc: "集群"},
  461. { value: "type", desc: "服务器分类"},
  462. { value: "sn", desc: "设备序列号"},
  463. { value: "resourcePool", desc: "资源池"},
  464. { value: "manageIp", desc: "管理网"},
  465. { value: "illoIp", desc: "ILLO地址"},
  466. { value: "period", desc: "期数"},
  467. { value: "position", desc: "机架位置"},
  468. { value: "publicIp", desc: "公网"},
  469. { value: "cn2Ip", desc: "CN2"},
  470. { value: "status", desc: "状态"},
  471. { value: "outIp", desc: "存储外网"},
  472. { value: "systemVersion", desc: "系统版本"},
  473. { value: "osVersion", desc: "内核版本"},
  474. { value: "use", desc: "用途"},
  475. { value: "deliveryDate", desc: "交付日期"},
  476. { value: "useUser", desc: "申请人"},
  477. { value: "tag", desc: "项目名称"},
  478. { value: "remarks", desc: "备注"},
  479. { value: "computerPosition", desc: "机房位置"},
  480. { value: "desc", desc: "硬件信息"},
  481. ],
  482. allCols: [
  483. { prop: "select", label: "选择", sort: true},
  484. { prop: "index", label: "序号", sort: true},
  485. { prop: "name", label: "设备型号", sort: true,fixed:false},
  486. { prop: "cluster.name", label: "集群", type: "cluster", sort: false,fixed:false},
  487. { prop: "type", label: "服务器分类", sort: true,fixed:false},
  488. { prop: "sn", label: "设备序列号", sort: true,fixed:false},
  489. { prop: "manageIp", label: "管理网", sort: true,fixed:false},
  490. { prop: "illoIp", label: "ILLO地址", sort: true,fixed:false},
  491. { prop: "period", label: "期数", sort: true,fixed:false},
  492. { prop: "position", label: "机架位置", sort: true,fixed:false},
  493. { prop: "publicIp", label: "公网", sort: true,fixed:false},
  494. { prop: "cn2Ip", label: "CN2", sort: true,fixed:false},
  495. { prop: "status", label: "状态", type: "status", sort: true,fixed:false},
  496. { prop: "outIp", label: "存储外网", sort: true,fixed:false},
  497. { prop: "systemVersion", label: "系统版本", sort: true,fixed:false},
  498. { prop: "osVersion", label: "内核版本", sort: true,fixed:false},
  499. { prop: "use", label: "用途", sort: true,fixed:false},
  500. { prop: "deliveryDate", label: "交付日期", type: "date", sort: true,fixed:false},
  501. { prop: "resourcePool", label: "资源池", type: "resourcePool", sort: true,fixed:false},
  502. { prop: "useUser", label: "申请人", sort: true,fixed:false},
  503. { prop: "tag", label: "项目名称", sort: true,fixed:false},
  504. { prop: "remarks", label: "备注", sort: true,fixed:false},
  505. { prop: "computerPosition", label: "机房位置", sort: true,fixed:false},
  506. { prop: "desc", label: "硬件信息", width: "700px", sort: false,fixed:false},
  507. ],
  508. multipleSelection: [],
  509. sortMap: null,
  510. column:null,
  511. index:null,
  512. editData:[
  513. { methodName:"cpuInfo", name:"硬件信息"},
  514. { methodName:"historyInfo", name:"历史变更"},
  515. { methodName:"editDevice", name:"编辑资产"},
  516. { methodName:"deleteDevice", name:"删除资产"},
  517. ]
  518. }
  519. },
  520. created() {
  521. this.getList()
  522. findAllDeviceType().then(response => {
  523. this.deviceTypeList = response;
  524. })
  525. findAllCluster().then(response => {
  526. this.clusterList = response;
  527. })
  528. },
  529. mounted() {
  530. },
  531. methods: {
  532. changeType(val) {
  533. if (val) {
  534. this.tags = this.allTags[val]
  535. }
  536. },
  537. addTag() {
  538. this.tagList = {
  539. type: null,
  540. id: null
  541. }
  542. this.tagVisible = true
  543. },
  544. handleSearchFormReset() {
  545. this.listQuery.searchForm = []
  546. this.searchForm = [{
  547. key: null,
  548. value: null
  549. }]
  550. this.getList();
  551. },
  552. onSearch() {
  553. this.getList();
  554. this.searchVisible = false;
  555. },
  556. addSearchInfo() {
  557. this.searchForm.push({
  558. key: null,
  559. value: null
  560. })
  561. },
  562. deleteSearchInfo(index) {
  563. this.searchForm.splice(index, 1);
  564. },
  565. search() {
  566. this.searchVisible = true;
  567. },
  568. handleClose(done) {
  569. this.$confirm('确认关闭?')
  570. .then(_ => {
  571. done();
  572. })
  573. .catch(_ => {
  574. });
  575. },
  576. handleSizeChange(val) {
  577. this.page.size = val;
  578. this.getList();
  579. },
  580. handleCurrentChange(val) {
  581. this.page.current = val;
  582. this.getList();
  583. },
  584. saveTag() {
  585. if (this.multipleSelection.length === 0) {
  586. this.$message({
  587. type: 'warning',
  588. message: '请先选择要修改的机器'
  589. });
  590. return
  591. }
  592. addTag({
  593. ids: this.multipleSelection,
  594. tagId: this.tagList.id
  595. }).then(res => {
  596. this.$message({
  597. type: 'success',
  598. message: '添加成功'
  599. });
  600. this.tagVisible = false;
  601. this.getList()
  602. })
  603. },
  604. exportRepair() {
  605. if (this.multipleSelection.length === 0) {
  606. this.$message({
  607. type: 'warning',
  608. message: '请先选择要导出的机器'
  609. });
  610. return
  611. }
  612. exportRepairInfo(this.multipleSelection).then(res => {
  613. let data = res;
  614. const textarea = document.createElement("textarea");
  615. textarea.setAttribute("readonly", true);
  616. textarea.value = data;
  617. document.body.appendChild(textarea);
  618. textarea.setSelectionRange(0, textarea.value.length);
  619. textarea.select();
  620. if (document.execCommand("copy")) {
  621. this.$message({
  622. type: 'success',
  623. message: '复制成功'
  624. });
  625. } else {
  626. this.$message({
  627. type: 'error',
  628. message: '复制失败'
  629. });
  630. }
  631. document.body.removeChild(textarea);
  632. })
  633. },
  634. saveOrder() {
  635. let result = JSON.stringify(this.$refs.tableData.dropCol);
  636. let data = {
  637. orders: result,
  638. type: "device"
  639. }
  640. saveOrders(data).then(res => {
  641. this.$message({
  642. type: 'success',
  643. message: '保存成功 '
  644. });
  645. this.$store.dispatch('SetOrders', result)
  646. })
  647. },
  648. addHs() {
  649. this.$prompt('请输入变更记录', '提示', {
  650. confirmButtonText: '确定',
  651. cancelButtonText: '取消',
  652. }).then(({ value}) => {
  653. addHistories({
  654. deviceId: this.multipleSelection,
  655. message: value
  656. }).then(response => {
  657. this.$message({
  658. type: 'success',
  659. message: '添加变更成功 '
  660. });
  661. this.HistoryVisible = false;
  662. this.getList();
  663. })
  664. }).catch(() => {
  665. this.$message({
  666. type: 'info',
  667. message: '取消添加'
  668. });
  669. });
  670. },
  671. changeCols() {
  672. if (this.cols && this.cols.hasOwnProperty('device')) {
  673. if (!this.cols['device']) {
  674. this.colsList = []
  675. this.changeVisible = true;
  676. return
  677. }
  678. let str = this.cols['device'];
  679. let data = this.utils.str2Arr(str);
  680. this.colsList = data;
  681. } else {
  682. this.colsList = [];
  683. }
  684. this.changeVisible = true;
  685. },
  686. saveCols() {
  687. let result = this.utils.arr2Str(this.colsList);
  688. let data = {
  689. cols: result,
  690. type: "device"
  691. }
  692. saveColsInfo(data).then(res => {
  693. this.changeVisible = false;
  694. this.$message({
  695. type: 'success',
  696. message: '变更成功 '
  697. });
  698. this.$store.dispatch('SetCols', result)
  699. location.reload()
  700. })
  701. },
  702. getDate(time) {
  703. return moment(time).format('YYYY-MM-DD')
  704. },
  705. getDateTime(time) {
  706. return moment(time).format('YYYY-MM-DD HH:mm:ss')
  707. },
  708. addHistory() {
  709. this.$prompt('请输入变更记录', '提示', {
  710. confirmButtonText: '确定',
  711. cancelButtonText: '取消',
  712. }).then(({ value}) => {
  713. addHistory({
  714. deviceId: this.history_deviceId,
  715. message: value
  716. }).then(response => {
  717. this.$message({
  718. type: 'success',
  719. message: '添加变更成功 '
  720. });
  721. this.HistoryVisible = false;
  722. this.getList();
  723. })
  724. }).catch(() => {
  725. this.$message({
  726. type: 'info',
  727. message: '取消添加'
  728. });
  729. });
  730. },
  731. historyInfo(row) {
  732. this.history = row.histories;
  733. this.HistoryVisible = true;
  734. this.history_deviceId = row.id
  735. },
  736. handleFilter() {
  737. this.listQuery.page = 1
  738. this.getList()
  739. },
  740. cpuInfo(row) {
  741. this.deviceType = row.deviceType
  742. this.CPUVisible = true;
  743. },
  744. memoryInfo(row) {
  745. this.deviceType = row.deviceType
  746. this.MemoryVisible = true;
  747. },
  748. nicInfo(row) {
  749. this.deviceType = row.deviceType
  750. this.NicVisible = true;
  751. },
  752. diskInfo(row) {
  753. this.deviceType = row.deviceType
  754. this.DiskVisible = true;
  755. },
  756. saveDevice(formName) {
  757. this.$refs[formName].validate((valid) => {
  758. if (valid) {
  759. if (this.editFlag === 0) {
  760. createDevice(
  761. this.temp
  762. ).then(response => {
  763. this.$message({
  764. message: '保存成功',
  765. type: 'success'
  766. });
  767. this.getList();
  768. this.resetDeviceForm('ruleForm')
  769. })
  770. } else {
  771. modifyDevice(
  772. this.temp
  773. ).then(response => {
  774. this.$message({
  775. message: '保存成功',
  776. type: 'success'
  777. });
  778. this.getList();
  779. this.resetDeviceForm('ruleForm')
  780. })
  781. }
  782. } else {
  783. this.$message.error('保存失败,请重试');
  784. return false;
  785. }
  786. });
  787. },
  788. handleAvatarSuccess(res, file) {
  789. if (res.code != 200) {
  790. this.$message({
  791. message: res.msg,
  792. type: 'error'
  793. });
  794. return
  795. }
  796. this.$message({
  797. message: '上传成功',
  798. type: 'success'
  799. });
  800. this.getList()
  801. },
  802. resetDeviceForm(formName) {
  803. this.$refs[formName].resetFields();
  804. this.dialogFormVisible = false;
  805. },
  806. getList() {
  807. this.listLoading = true
  808. this.listQuery.page = this.page.current
  809. this.listQuery.limit = this.page.size
  810. this.listQuery.searchForm = this.searchForm
  811. if (this.sortMap) {
  812. this.listQuery.sortForm = this.strMapToObj(this.sortMap)
  813. } else {
  814. this.listQuery.sortForm = null
  815. }
  816. fetchList(this.listQuery).then(response => {
  817. this.list = response.content;
  818. this.page.total = response.totalElements;
  819. this.listLoading = false
  820. })
  821. },
  822. strMapToObj(strMap) {
  823. let obj = Object.create(null);
  824. for (let [k, v] of strMap) {
  825. obj[k] = v;
  826. }
  827. return obj;
  828. },
  829. createDevice() {
  830. this.resetTemp()
  831. this.dialogFormVisible = true;
  832. this.editFlag = 0;
  833. },
  834. editDevice(item) {
  835. this.resetTemp()
  836. this.temp.id = item.id;
  837. this.temp.clusterId = item.cluster.id;
  838. this.temp.name = item.name;
  839. this.temp.use = item.use;
  840. this.temp.deliveryDate = item.deliveryDate;
  841. this.temp.type = item.type;
  842. this.temp.period = item.period;
  843. this.temp.manageIp = item.manageIp;
  844. this.temp.illoIp = item.illoIp;
  845. this.temp.remarks = item.remarks;
  846. this.temp.deviceType = item.deviceType;
  847. this.temp.sn = item.sn;
  848. this.temp.tag = item.tag;
  849. this.temp.resourcePool = item.resourcePool;
  850. this.temp.position = item.position;
  851. this.temp.systemVersion = item.systemVersion;
  852. this.temp.osVersion = item.osVersion;
  853. this.temp.publicIp = item.publicIp;
  854. this.temp.outIp = item.outIp;
  855. this.temp.cn2Ip = item.cn2Ip;
  856. this.temp.computerPosition = item.computerPosition
  857. this.dialogFormVisible = true;
  858. this.editFlag = 1;
  859. },
  860. resetTemp() {
  861. this.temp = {
  862. id: null,
  863. name: null,
  864. clusterId: null,
  865. use: null,
  866. deliveryDate: null,
  867. type: null,
  868. manageIp: null,
  869. illoIp: null,
  870. period: null,
  871. remarks: null,
  872. deviceType: null,
  873. sn: null,
  874. tag: null,
  875. resourcePool: null,
  876. position: null,
  877. useUser: null,
  878. startDate: null,
  879. systemVersion: null,
  880. osVersion: null,
  881. outIp: null,
  882. publicIp: null,
  883. cn2Ip: null,
  884. }
  885. },
  886. deleteDevice(row) {
  887. this.$confirm('此操作将删除该资产, 是否继续?', '提示', {
  888. confirmButtonText: '确定',
  889. cancelButtonText: '取消',
  890. type: 'warning'
  891. }).then(() => {
  892. deleteDevice(row.id).then(response => {
  893. this.getList();
  894. this.$message({
  895. type: 'success',
  896. message: '删除成功!'
  897. });
  898. })
  899. }).catch(() => {
  900. this.$message({
  901. type: 'info',
  902. message: '已取消删除'
  903. });
  904. });
  905. },
  906. }
  907. }
  908. </script>
  909. <style>
  910. .el-dropdown-link {
  911. cursor: pointer;
  912. color: #409EFF;
  913. }
  914. .demo-table-expand {
  915. font-size: 0;
  916. }
  917. .demo-table-expand label {
  918. width: 90px;
  919. color: #99a9bf;
  920. }
  921. .demo-table-expand .el-form-item {
  922. margin-right: 0;
  923. margin-bottom: 0;
  924. width: 50%;
  925. }
  926. .rowClass {
  927. height: 30px;
  928. padding: 0 !important;
  929. }
  930. .cellClass {
  931. padding: 2px !important;
  932. }
  933. .el-table--striped .el-table__body tr.el-table__row--striped.current-row td,
  934. .el-table__body tr.current-row > td {
  935. background-color: #a0cfff;
  936. }
  937. .el-table--striped .el-table__body tr.hover-row.el-table__row--striped > td,
  938. .el-table__body tr.hover-row > td {
  939. background-color: #d9ecff !important;
  940. }
  941. </style>

发表评论

表情:
评论列表 (有 0 条评论,107人围观)

还没有评论,来说两句吧...

相关阅读