table.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <template>
  2. <div class="container">
  3. <!-- <el-table v-loading="loading" border stripe :data="data" style="width: 100%">
  4. <el-table-column align="center" prop="id" label="ID"/>
  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="创建时间"/>
  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 size="small" type="text" @click="onRowDel(scope.row)">详情</el-button>
  20. <el-button size="small" type="text" @click="onOpenEditSign(scope.row)">编辑</el-button>
  21. <el-button size="small" type="text" @click="onRowDetail(scope.row)">更多</el-button>
  22. </template>
  23. </el-table-column>
  24. </el-table> -->
  25. <div class="content">
  26. <!-- <section v-for="(item, index) in data" :key="index"> -->
  27. <el-card class="item" @click="toDetail(item.id)" shadow="hover" v-for="(item, index) in data" :key="index">
  28. <div class="top-inner-wrap">
  29. <span>通道:{{item.id}}</span>
  30. <span class="more">更多
  31. <i class="fa fa-angle-down"></i>
  32. <!-- <ele-ArrowDown /> -->
  33. </span>
  34. </div>
  35. <div class="content-wrap">
  36. <div class="name-and-status">
  37. <span>{{item.name}}</span>
  38. [
  39. <span>{{item.status?'启动':'未启动'}}</span>
  40. ]
  41. </div>
  42. <div class="">
  43. <span>{{item.types}}</span>
  44. <span style="margin-left: 6px;">{{item.name}}</span>
  45. </div>
  46. </div>
  47. </el-card>
  48. </div>
  49. <el-pagination
  50. @size-change="onHandleSizeChange"
  51. @current-change="onHandleCurrentChange"
  52. class="mt15"
  53. :pager-count="5"
  54. :page-sizes="[10, 20, 30]"
  55. v-model:current-page="param.page"
  56. background
  57. v-model:page-size="param.pageSize"
  58. layout="total, sizes, prev, pager, next, jumper"
  59. :total="total"
  60. >
  61. </el-pagination>
  62. </div>
  63. </template>
  64. <script lang="ts">
  65. import { ref, toRefs, reactive, onMounted, nextTick, computed, watch, defineComponent } from 'vue';
  66. import { useRouter } from 'vue-router';
  67. import api from '/@/api/network';
  68. // 定义接口来定义对象的类型
  69. interface TableDataForm {
  70. id: number;
  71. server: string;
  72. name: string;
  73. }
  74. interface TableData {
  75. data: Array<TableDataForm>;
  76. total: number;
  77. loading: boolean;
  78. param: {
  79. page: number;
  80. pageSize: number;
  81. };
  82. }
  83. export default defineComponent({
  84. name: 'tunnelTable',
  85. props: {
  86. // 输入框前置内容
  87. queryForm: {
  88. type: Object,
  89. default: () => {},
  90. },
  91. },
  92. setup(props, { emit }) {
  93. const router = useRouter();
  94. const state = reactive<TableData>({
  95. data: [],
  96. total: 0,
  97. loading: false,
  98. param: {
  99. page: 1,
  100. pageSize: 10,
  101. },
  102. });
  103. // 分页改变
  104. const onHandleSizeChange = (val: number) => {
  105. state.param.pageSize = val;
  106. fetchList()
  107. };
  108. // 分页改变
  109. const onHandleCurrentChange = (val: number) => {
  110. state.param.page = val;
  111. fetchList()
  112. };
  113. // 初始化表格数据
  114. const initTableData = () => {
  115. fetchList()
  116. };
  117. // 获取数据
  118. const fetchList = () => {
  119. console.log(props.queryForm.title)
  120. let params = {
  121. keyWord: props.queryForm.title,
  122. pageNum: state.param.page,
  123. PageSize: state.param.pageSize
  124. }
  125. api.server.getList(params).then((res: any) => {
  126. console.log(res);
  127. const { list, total, page } = res
  128. state.data = list
  129. state.total = total
  130. state.param.page = page
  131. });
  132. };
  133. const toDetail = (id: number) => {
  134. router.push(`/network/server/detail/${id}`)
  135. };
  136. // 监听双向绑定 queryForm 的变化
  137. watch(
  138. () => props.queryForm,
  139. // 新数据
  140. () => {
  141. fetchList()
  142. },
  143. { deep: true,
  144. immediate: true
  145. },
  146. );
  147. // 页面加载时
  148. onMounted(() => {
  149. initTableData();
  150. });
  151. return {
  152. fetchList,
  153. toDetail,
  154. onHandleSizeChange,
  155. onHandleCurrentChange,
  156. ...toRefs(state),
  157. };
  158. }
  159. });
  160. </script>
  161. <style lang="scss" scoped>
  162. .container {
  163. width: 100%;
  164. .content {
  165. display: flex;
  166. flex-flow: row wrap;
  167. width: 100%;
  168. .item {
  169. width: calc((100% - 40px)/3);
  170. cursor: pointer;
  171. border-radius: 6px;
  172. .top-inner-wrap {
  173. font-size: 15px;
  174. display: flex;
  175. justify-content: space-between;
  176. background: transparent;
  177. border-bottom: 1px solid var(--el-card-border-color);
  178. // border: 1px solid var(--el-card-border-color);
  179. .more {
  180. color: var(--el-color-primary);
  181. }
  182. }
  183. .content-wrap {
  184. .name-and-status {
  185. margin: 12px 0 8px 0;
  186. }
  187. }
  188. }
  189. .item:not(:nth-child(3n+1)) {
  190. margin-left: 20px;
  191. }
  192. .item:nth-of-type(n+4) {
  193. margin-top: 20px;
  194. }
  195. }
  196. }
  197. </style>