list.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <template>
  2. <div>
  3. <el-table
  4. v-loading="loading"
  5. :data="data"
  6. style="width: 100%"
  7. >
  8. <el-table-column
  9. align="center"
  10. prop="id"
  11. label="ID"
  12. width="80"
  13. v-col="'id'"
  14. />
  15. <!-- <el-table-column align="center" prop="server" label="服务器"/> -->
  16. <el-table-column
  17. align="center"
  18. prop="name"
  19. label="名称"
  20. v-col="'name'"
  21. />
  22. <el-table-column
  23. align="center"
  24. prop="types"
  25. label="类型"
  26. v-col="'types'"
  27. />
  28. <el-table-column
  29. align="center"
  30. prop="addr"
  31. label="地址"
  32. v-col="'addr'"
  33. />
  34. <el-table-column
  35. show-overflow-tooltip
  36. align="center"
  37. prop="createdAt"
  38. label="创建时间"
  39. width="170"
  40. v-col="'createdAt'"
  41. />
  42. <!-- <el-table-column align="center" prop="last" label="最近上线"/> -->
  43. <el-table-column
  44. align="center"
  45. prop="types"
  46. label="状态"
  47. v-col="'status'"
  48. >
  49. <template #default="scope">
  50. <el-tag
  51. v-if="!scope.row.status"
  52. class="ml-2"
  53. type="info"
  54. >未启动</el-tag>
  55. <el-tag
  56. v-else
  57. class="ml-2"
  58. type="success"
  59. >启动</el-tag>
  60. </template>
  61. </el-table-column>
  62. <el-table-column
  63. align="center"
  64. label="操作"
  65. width="200"
  66. v-col="'auth'"
  67. >
  68. <template #default="scope">
  69. <el-button
  70. @click="toDetail(scope.row.id)"
  71. size="small"
  72. type="text"
  73. v-auth="'detail'"
  74. >详情</el-button>
  75. <el-button
  76. size="small"
  77. link
  78. key="info"
  79. type="info"
  80. v-auth="'edit'"
  81. @click="toEdit(scope.row.id)"
  82. >编辑</el-button>
  83. <el-popover
  84. placement="bottom"
  85. :width="160"
  86. trigger="click"
  87. >
  88. <template #reference>
  89. <el-button
  90. size="small"
  91. type="text"
  92. class="more-btn"
  93. @click="isShowMore = !isShowMore"
  94. v-auth="'more'"
  95. >更多
  96. <i
  97. style="margin-left: 2px;"
  98. :class="isShowMore ? 'fa fa-angle-down':'fa fa-angle-up'"
  99. ></i>
  100. </el-button>
  101. </template>
  102. <div class="more-opearte-wrap">
  103. <el-button
  104. @click="onChangeStatus(scope.row.id, 1)"
  105. :disabled="scope.row.status"
  106. link
  107. size="small"
  108. key="success"
  109. type="success"
  110. v-auth="'on'"
  111. >启 用</el-button>
  112. <el-divider direction="vertical" />
  113. <el-button
  114. @click="onChangeStatus(scope.row.id, 0)"
  115. :disabled="!scope.row.status"
  116. link
  117. size="small"
  118. key="warning"
  119. type="warning"
  120. v-auth="'off'"
  121. >禁 用</el-button>
  122. <el-divider direction="vertical" />
  123. <el-button
  124. @click="onRowDel(scope.row)"
  125. link
  126. size="small"
  127. key="danger"
  128. type="danger"
  129. v-auth="'delete'"
  130. >删 除</el-button>
  131. </div>
  132. </el-popover>
  133. </template>
  134. </el-table-column>
  135. </el-table>
  136. <el-pagination
  137. @size-change="onHandleSizeChange"
  138. @current-change="onHandleCurrentChange"
  139. class="mt15"
  140. :pager-count="5"
  141. :page-sizes="[10, 20, 30]"
  142. v-model:current-page="param.page"
  143. background
  144. v-model:page-size="param.pageSize"
  145. layout="total, sizes, prev, pager, next, jumper"
  146. :total="total"
  147. >
  148. </el-pagination>
  149. </div>
  150. </template>
  151. <script lang="ts">
  152. import { ref, toRefs, reactive, onMounted, nextTick, computed, watch, defineComponent } from 'vue';
  153. import { ElMessageBox, ElMessage } from 'element-plus';
  154. import { useRouter } from 'vue-router';
  155. import api from '/@/api/network';
  156. // 定义接口来定义对象的类型
  157. interface TableDataForm {
  158. id: number;
  159. server: string;
  160. name: string;
  161. }
  162. interface TableData {
  163. data: Array<TableDataForm>;
  164. total: number;
  165. loading: boolean;
  166. param: {
  167. page: number;
  168. pageSize: number;
  169. };
  170. isShowMore: boolean
  171. }
  172. export default defineComponent({
  173. name: 'tunnel',
  174. props: {
  175. // 输入框前置内容
  176. keyWord: {
  177. type: Object,
  178. default: () => { },
  179. },
  180. },
  181. setup(props, { emit }) {
  182. const router = useRouter();
  183. const state = reactive<TableData>({
  184. data: [],
  185. total: 0,
  186. loading: false,
  187. param: {
  188. page: 1,
  189. pageSize: 10,
  190. },
  191. isShowMore: true
  192. });
  193. // 改变状态
  194. const onChangeStatus = (id: number, status: number) => {
  195. api.server.changeServerStatus({ id: id, status: status }).then((res: any) => {
  196. ElMessage.success(status ? '已开启' : '已关闭');
  197. fetchList();
  198. })
  199. };
  200. // 分页改变
  201. const onHandleSizeChange = (val: number) => {
  202. state.param.pageSize = val;
  203. fetchList()
  204. };
  205. // 分页改变
  206. const onHandleCurrentChange = (val: number) => {
  207. state.param.page = val;
  208. fetchList()
  209. };
  210. // 初始化表格数据
  211. const initTableData = () => {
  212. fetchList()
  213. };
  214. // 获取数据
  215. const fetchList = () => {
  216. state.loading = true
  217. let params = {
  218. keyWord: props.keyWord,
  219. pageNum: state.param.page,
  220. PageSize: state.param.pageSize
  221. }
  222. api.server.getList(params).then((res: any) => {
  223. console.log(res);
  224. const { list, total, page } = res
  225. state.data = list
  226. state.total = total
  227. state.param.page = page
  228. state.loading = false
  229. });
  230. };
  231. // 删除
  232. const onRowDel = (row: TableDataForm) => {
  233. ElMessageBox.confirm(`此操作将永久删除“${row.name}”,是否继续?`, '提示', {
  234. confirmButtonText: '确认',
  235. cancelButtonText: '取消',
  236. type: 'warning',
  237. })
  238. .then(() => {
  239. api.server.deleteItem({ ids: [row.id] }).then((res: any) => {
  240. fetchList()
  241. ElMessage.success('删除成功');
  242. });
  243. })
  244. .catch(() => { });
  245. };
  246. const toDetail = (id: number) => {
  247. router.push(`/iotmanager/network/server/detail/${id}`)
  248. };
  249. const toEdit = (id: number) => {
  250. router.push(`/iotmanager/network/server/edit/${id}`)
  251. };
  252. // 监听双向绑定 keyWord 的变化
  253. watch(
  254. () => props.keyWord,
  255. // 新数据
  256. () => {
  257. fetchList()
  258. },
  259. {
  260. deep: true,
  261. immediate: true
  262. },
  263. );
  264. // 页面加载时
  265. onMounted(() => {
  266. initTableData();
  267. });
  268. return {
  269. fetchList,
  270. toDetail,
  271. toEdit,
  272. onChangeStatus,
  273. onRowDel,
  274. onHandleSizeChange,
  275. onHandleCurrentChange,
  276. ...toRefs(state),
  277. };
  278. }
  279. });
  280. </script>
  281. <style lang="scss" scoped>
  282. ::v-deep div.more-opearte-wrap {
  283. flex-direction: row;
  284. background-color: pink;
  285. // padding: 4px!important;
  286. div {
  287. }
  288. }
  289. </style>