index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <script setup lang="ts">
  2. defineOptions({
  3. name: 'Role Management',
  4. })
  5. import { Plus } from '@element-plus/icons-vue'
  6. import { ElButton, ElDialog, ElEmpty, ElInput, ElOption, ElPagination, ElSelect, ElTable, ElTableColumn, ElTag } from 'element-plus'
  7. // import SearchForm from './components/SearchForm.vue'
  8. import type { TAgent } from '@/types/role'
  9. import { anycallPage } from '@/api/modules/anycallService'
  10. import { formatDateGeneral } from '@/utils'
  11. const tableRef = ref()
  12. const loading = ref(false)
  13. const router = useRouter()
  14. const route = useRoute()
  15. // 搜索参数
  16. const searchParams = ref({
  17. name: '',
  18. })
  19. const dataList = ref<TAgent[]>([]);
  20. // 从URL获取初始分页参数
  21. const getInitialPagination = () => {
  22. const page = Number(route.query.page) || 1
  23. const size = Number(route.query.size) || 20
  24. return {
  25. total: 0,
  26. page: page > 0 ? page : 1,
  27. size: [10, 20, 50, 100].includes(size) ? size : 20,
  28. }
  29. }
  30. // 分页信息
  31. const pagination = ref(getInitialPagination())
  32. // 更新URL中的分页参数
  33. const updateUrlParams = (page: number, size: number) => {
  34. const query = {
  35. ...route.query,
  36. page: page.toString(),
  37. size: size.toString(),
  38. }
  39. // 使用replace模式更新URL,避免产生历史记录
  40. router.replace({
  41. path: route.path,
  42. query
  43. })
  44. }
  45. const handleCreate = ()=> {
  46. router.push({
  47. name: 'CharacterEdit', // 使用路由名称跳转,更推荐
  48. params: {
  49. id: '' // 传递角色ID
  50. }
  51. })
  52. }
  53. async function fetchList() {
  54. loading.value = true
  55. const res = await anycallPage({
  56. name: searchParams.value.name,
  57. page: pagination.value.page,
  58. size: pagination.value.size,
  59. })
  60. if(res.code === 0){
  61. dataList.value = res.data.content
  62. pagination.value.total = res.data.total
  63. }
  64. loading.value = false
  65. }
  66. function handlePageChange(page: number) {
  67. pagination.value.page = page
  68. updateUrlParams(page, pagination.value.size)
  69. fetchList()
  70. }
  71. function handleSizeChange(size: number) {
  72. pagination.value.size = size
  73. pagination.value.page = 1
  74. updateUrlParams(1, size)
  75. fetchList()
  76. }
  77. function handleSearch () {
  78. pagination.value.page = 1 // 搜索时重置到第一页
  79. updateUrlParams(1, pagination.value.size)
  80. fetchList()
  81. }
  82. function handleReset () {
  83. searchParams.value = {
  84. name: '',
  85. }
  86. pagination.value.page = 1 // 重置时重置到第一页
  87. updateUrlParams(1, pagination.value.size)
  88. fetchList()
  89. }
  90. // 监听URL参数变化,用于处理浏览器后退/前进
  91. watch(
  92. () => route.query,
  93. (newQuery) => {
  94. const newPage = Number(newQuery.page) || 1
  95. const newSize = Number(newQuery.size) || 20
  96. // 只有当参数真正发生变化时才更新
  97. if (newPage !== pagination.value.page || newSize !== pagination.value.size) {
  98. pagination.value.page = newPage > 0 ? newPage : 1
  99. pagination.value.size = [10, 20, 50, 100].includes(newSize) ? newSize : 20
  100. fetchList()
  101. }
  102. },
  103. { deep: true }
  104. )
  105. onMounted(async () => {
  106. await fetchList()
  107. })
  108. </script>
  109. <template>
  110. <div>
  111. <FaPageHeader title="Role Management" />
  112. <FaPageMain>
  113. <ElTable
  114. ref="tableRef" :data="dataList" stripe highlight-current-row border height="100%"
  115. >
  116. <ElTableColumn label="Role Name" prop="name" />
  117. </ElTable>
  118. <div class="p-4">
  119. <ElPagination
  120. v-model:current-page="pagination.page"
  121. v-model:page-size="pagination.size"
  122. :total="pagination.total"
  123. :page-sizes="[10, 20, 50, 100]"
  124. layout="total, sizes, prev, pager, next, jumper"
  125. @size-change="handleSizeChange"
  126. @current-change="handlePageChange"
  127. />
  128. </div>
  129. </FaPageMain>
  130. </div>
  131. </template>