token.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <template>
  2. <div>
  3. <el-card class="list-query" shadow="hover">
  4. <el-form inline label-width="80px">
  5. <el-form-item :label="T('User')">
  6. <el-select v-model="listQuery.user_id" clearable>
  7. <el-option
  8. v-for="item in allUsers"
  9. :key="item.id"
  10. :label="item.username"
  11. :value="item.id"
  12. ></el-option>
  13. </el-select>
  14. </el-form-item>
  15. <el-form-item>
  16. <el-button type="primary" @click="handlerQuery">{{ T('Filter') }}</el-button>
  17. <el-button type="danger" @click="toBatchDelete">{{ T('BatchDelete') }}</el-button>
  18. </el-form-item>
  19. </el-form>
  20. </el-card>
  21. <el-card class="list-body" shadow="hover">
  22. <el-table :data="listRes.list" v-loading="listRes.loading" border @selection-change="handleSelectionChange">
  23. <el-table-column type="selection" align="center" width="50"/>
  24. <el-table-column prop="id" label="id" align="center" width="100"/>
  25. <el-table-column :label="T('Owner')" align="center">
  26. <template #default="{row}">
  27. <span v-if="row.user_id"> <el-tag>{{ allUsers?.find(u => u.id === row.user_id)?.username }}</el-tag> </span>
  28. </template>
  29. </el-table-column>
  30. <el-table-column :label="T('Token')" align="center">
  31. <template #default="{row}">
  32. <span> {{ maskToken(row.token) }} </span>
  33. </template>
  34. </el-table-column>
  35. <el-table-column prop="created_at" :label="T('CreatedAt')" align="center"/>
  36. <el-table-column :label="T('ExpireTime')" prop="expired_at" align="center">
  37. <template #default="{row}">
  38. <el-tag :type="expired(row)?'info':'success'">{{ row.expired_at ? new Date(row.expired_at * 1000).toLocaleString() : '-' }}</el-tag>
  39. </template>
  40. </el-table-column>
  41. <el-table-column :label="T('Actions')" align="center" width="400">
  42. <template #default="{row}">
  43. <el-button type="danger" @click="del(row)">{{ T('Logout') }}</el-button>
  44. </template>
  45. </el-table-column>
  46. </el-table>
  47. </el-card>
  48. <el-card class="list-page" shadow="hover">
  49. <el-pagination background
  50. layout="prev, pager, next, sizes, jumper"
  51. :page-sizes="[10,20,50,100]"
  52. v-model:page-size="listQuery.page_size"
  53. v-model:current-page="listQuery.page"
  54. :total="listRes.total">
  55. </el-pagination>
  56. </el-card>
  57. </div>
  58. </template>
  59. <script setup>
  60. import { onActivated, onMounted, ref, watch } from 'vue'
  61. import { loadAllUsers } from '@/global'
  62. import { useRepositories } from '@/views/user/token.js'
  63. import { T } from '@/utils/i18n'
  64. const { allUsers, getAllUsers } = loadAllUsers()
  65. getAllUsers()
  66. const {
  67. listRes,
  68. listQuery,
  69. getList,
  70. handlerQuery,
  71. del,
  72. batchDelete,
  73. } = useRepositories()
  74. onMounted(getList)
  75. onActivated(getList)
  76. watch(() => listQuery.page, getList)
  77. watch(() => listQuery.page_size, handlerQuery)
  78. const maskToken = (token) => {
  79. return token.slice(0, 4) + '****' + token.slice(-4)
  80. }
  81. const expired = (row) => {
  82. const now = new Date().getTime()
  83. return row.expired_at * 1000 < now
  84. }
  85. const multipleSelection = ref([])
  86. const handleSelectionChange = (val) => {
  87. multipleSelection.value = val
  88. }
  89. const toBatchDelete = () => {
  90. if (multipleSelection.value.length === 0) {
  91. return
  92. }
  93. batchDelete(multipleSelection.value.map(v => v.id))
  94. }
  95. </script>
  96. <style scoped lang="scss">
  97. .list-query .el-select {
  98. --el-select-width: 160px;
  99. }
  100. </style>