list.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <template>
  2. <div>
  3. <el-table v-loading="loading" border stripe :data="data" style="width: 100%">
  4. <el-table-column align="center" prop="id" label="ID" width="80"/>
  5. <!-- <el-table-column align="center" prop="server" label="服务器"/> -->
  6. <el-table-column align="center" prop="name" label="名称"/>
  7. <el-table-column align="center" prop="types" label="类型"/>
  8. <el-table-column align="center" prop="addr" label="地址"/>
  9. <el-table-column show-overflow-tooltip align="center" prop="createdAt" label="创建时间" width="170"/>
  10. <!-- <el-table-column align="center" prop="last" label="最近上线"/> -->
  11. <el-table-column align="center" prop="types" label="状态">
  12. <template #default="scope">
  13. <el-tag v-if="!scope.row.status" class="ml-2" type="danger">离线</el-tag>
  14. <el-tag v-else class="ml-2" type="success">在线</el-tag>
  15. </template>
  16. </el-table-column>
  17. <el-table-column align="center" label="操作" width="200">
  18. <template #default="scope">
  19. <el-button @click="toDetail(scope.row.id)" size="small" type="text">详情</el-button>
  20. <el-button size="small" link key="info" type="info" @click="onOpenEditSign(scope.row)">编辑</el-button>
  21. <el-popover placement="bottom" :width="160" trigger="click">
  22. <template #reference>
  23. <el-button size="small" type="text" class="more-btn" @click="isShowMore = !isShowMore">更多
  24. <i style="margin-left: 2px;" :class="isShowMore ? 'fa fa-angle-down':'fa fa-angle-up'"></i>
  25. </el-button>
  26. </template>
  27. <div class="more-opearte-wrap">
  28. <el-button link size="small" key="success" type="success">启 用</el-button>
  29. <el-divider direction="vertical" />
  30. <el-button link size="small" key="warning" type="warning">禁 用</el-button>
  31. <el-divider direction="vertical" />
  32. <el-button @click="onRowDel(scope.row)" link size="small" key="danger" type="danger">删 除</el-button>
  33. </div>
  34. </el-popover>
  35. </template>
  36. </el-table-column>
  37. </el-table>
  38. <el-pagination
  39. @size-change="onHandleSizeChange"
  40. @current-change="onHandleCurrentChange"
  41. class="mt15"
  42. :pager-count="5"
  43. :page-sizes="[10, 20, 30]"
  44. v-model:current-page="param.page"
  45. background
  46. v-model:page-size="param.pageSize"
  47. layout="total, sizes, prev, pager, next, jumper"
  48. :total="total"
  49. >
  50. </el-pagination>
  51. </div>
  52. </template>
  53. <script lang="ts">
  54. import { ref, toRefs, reactive, onMounted, nextTick, computed, watch, defineComponent } from 'vue';
  55. import { ElMessageBox, ElMessage } from 'element-plus';
  56. import { useRouter } from 'vue-router';
  57. import api from '/@/api/network';
  58. // 定义接口来定义对象的类型
  59. interface TableDataForm {
  60. id: number;
  61. server: string;
  62. name: string;
  63. }
  64. interface TableData {
  65. data: Array<TableDataForm>;
  66. total: number;
  67. loading: boolean;
  68. param: {
  69. page: number;
  70. pageSize: number;
  71. };
  72. isShowMore: boolean
  73. }
  74. export default defineComponent({
  75. name: 'tunnel',
  76. props: {
  77. // 输入框前置内容
  78. queryForm: {
  79. type: Object,
  80. default: () => {},
  81. },
  82. },
  83. setup(props, { emit }) {
  84. const router = useRouter();
  85. const state = reactive<TableData>({
  86. data: [],
  87. total: 0,
  88. loading: false,
  89. param: {
  90. page: 1,
  91. pageSize: 10,
  92. },
  93. isShowMore: true
  94. });
  95. // 分页改变
  96. const onHandleSizeChange = (val: number) => {
  97. state.param.pageSize = val;
  98. };
  99. // 分页改变
  100. const onHandleCurrentChange = (val: number) => {
  101. state.param.page = val;
  102. };
  103. // 初始化表格数据
  104. const initTableData = () => {
  105. fetchList()
  106. };
  107. // 获取数据
  108. const fetchList = () => {
  109. console.log(props.queryForm.title)
  110. let params = {
  111. OrderBy: props.queryForm.title,
  112. pageNum: state.param.page,
  113. PageSize: state.param.pageSize
  114. }
  115. api.getList(params).then((res: any) => {
  116. console.log(res);
  117. const { list, total, page } = res
  118. state.data = list
  119. state.total = total
  120. state.param.page = page
  121. });
  122. };
  123. // 删除
  124. const onRowDel = (row: TableDataForm) => {
  125. ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.name}”,是否继续?`, '提示', {
  126. confirmButtonText: '确认',
  127. cancelButtonText: '取消',
  128. type: 'warning',
  129. })
  130. .then(() => {
  131. api.deleteItem({ids: [row.id]}).then((res: any) => {
  132. fetchList()
  133. ElMessage.success('删除成功');
  134. });
  135. })
  136. .catch(() => {});
  137. };
  138. const toDetail = (id: number) => {
  139. router.push(`/network/tunnel/detail/${id}`)
  140. };
  141. // 监听双向绑定 queryForm 的变化
  142. watch(
  143. () => props.queryForm,
  144. // 新数据
  145. () => {
  146. fetchList()
  147. },
  148. { deep: true,
  149. immediate: true
  150. },
  151. );
  152. // 页面加载时
  153. onMounted(() => {
  154. initTableData();
  155. });
  156. return {
  157. fetchList,
  158. toDetail,
  159. onRowDel,
  160. onHandleSizeChange,
  161. onHandleCurrentChange,
  162. ...toRefs(state),
  163. };
  164. }
  165. });
  166. </script>
  167. <style lang="scss" scoped>
  168. ::v-deep div.more-opearte-wrap {
  169. flex-direction: row;
  170. background-color: pink;
  171. // padding: 4px!important;
  172. div {
  173. }
  174. }
  175. </style>