index.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <template>
  2. <div class="layout-padding">
  3. <div class="layout-padding-auto layout-padding-view">
  4. <el-row class="ml10" v-show="showSearch">
  5. <el-form :inline="true" :model="state.queryForm" @keyup.enter="getDataList" ref="queryRef">
  6. <el-form-item :label="$t('systoken.username')" prop="username">
  7. <el-input :placeholder="$t('systoken.inputUsernameTip')" v-model="state.queryForm.username"></el-input>
  8. </el-form-item>
  9. <el-form-item>
  10. <el-button @click="getDataList" icon="Search" type="primary">{{ $t('common.queryBtn') }} </el-button>
  11. <el-button @click="resetQuery" icon="Refresh">{{ $t('common.resetBtn') }}</el-button>
  12. </el-form-item>
  13. </el-form>
  14. </el-row>
  15. <el-row>
  16. <div class="mb8" style="width: 100%">
  17. <el-button :disabled="multiple" @click="handleDelete(selectObjs)" class="ml10" icon="Delete" type="primary" v-auth="'sys_user_del'">
  18. {{ $t('systoken.offlineBtn') }}
  19. </el-button>
  20. <right-toolbar
  21. @queryTable="getDataList"
  22. class="ml10"
  23. style="float: right; margin-right: 20px"
  24. v-model:showSearch="showSearch"
  25. ></right-toolbar>
  26. </div>
  27. </el-row>
  28. <el-table
  29. :data="state.dataList"
  30. @selection-change="handleSelectionChange"
  31. @sort-change="sortChangeHandle"
  32. style="width: 100%"
  33. v-loading="state.loading"
  34. border
  35. :cell-style="tableStyle.cellStyle"
  36. :header-cell-style="tableStyle.headerCellStyle"
  37. >
  38. <el-table-column align="center" type="selection" width="40" />
  39. <el-table-column :label="$t('systoken.index')" type="index" width="60" />
  40. <el-table-column :label="$t('systoken.username')" prop="username" show-overflow-tooltip width="150"></el-table-column>
  41. <el-table-column :label="$t('systoken.clientId')" prop="clientId" show-overflow-tooltip width="100"></el-table-column>
  42. <el-table-column :label="$t('systoken.accessToken')" prop="accessToken" show-overflow-tooltip>
  43. <template #default="scope">
  44. <el-button link type="danger" v-if="filterOwnToken(scope.row)">
  45. {{ scope.row.accessToken }}
  46. </el-button>
  47. </template>
  48. </el-table-column>
  49. <el-table-column :label="$t('systoken.expiresAt')" prop="expiresAt" show-overflow-tooltip></el-table-column>
  50. <el-table-column :label="$t('common.action')" width="100">
  51. <template #default="scope">
  52. <el-button icon="delete" @click="handleDelete([scope.row.accessToken])" size="small" text type="primary" v-auth="'sys_user_del'">
  53. {{ $t('systoken.offlineBtn') }}
  54. </el-button>
  55. </template>
  56. </el-table-column>
  57. </el-table>
  58. <pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination"> </pagination>
  59. </div>
  60. </div>
  61. </template>
  62. <script lang="ts" setup>
  63. import { BasicTableProps, useTable } from '/@/hooks/table';
  64. import { delObj, fetchList } from '/@/api/admin/token';
  65. import { useI18n } from 'vue-i18n';
  66. import { useMessage, useMessageBox } from '/@/hooks/message';
  67. import { Session } from '/@/utils/storage';
  68. const { t } = useI18n();
  69. // 定义变量内容
  70. const queryRef = ref();
  71. const showSearch = ref(true);
  72. // 多选rows
  73. const selectObjs = ref([]) as any;
  74. // 是否可以多选
  75. const multiple = ref(true);
  76. // table hook
  77. const state: BasicTableProps = reactive<BasicTableProps>({
  78. queryForm: {
  79. username: '',
  80. },
  81. pageList: fetchList,
  82. });
  83. const { getDataList, currentChangeHandle, sortChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
  84. // 清空搜索条件
  85. const resetQuery = () => {
  86. queryRef.value?.resetFields();
  87. getDataList();
  88. };
  89. // 多选事件
  90. const handleSelectionChange = (objs: { accessToken: string }[]) => {
  91. selectObjs.value = objs.map(({ accessToken }) => accessToken);
  92. multiple.value = !objs.length;
  93. };
  94. // 删除操作
  95. const handleDelete = async (accessTokens: string[]) => {
  96. try {
  97. await useMessageBox().confirm(t('systoken.offlineConfirmText'));
  98. } catch {
  99. return; // 取消删除则直接跳过此方法
  100. }
  101. try {
  102. await delObj(accessTokens);
  103. getDataList();
  104. useMessage().success(t('systoken.offlineSuccessText'));
  105. } catch (err: any) {
  106. useMessage().error(err.msg);
  107. }
  108. };
  109. // 判断当前token 是否和登录token一致
  110. const filterOwnToken = (row: any) => {
  111. return Session.getToken() === row.accessToken;
  112. };
  113. </script>