list.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <template>
  2. <CommonPage back :title="detail.title ">
  3. <template #action>
  4. <NButton type="primary">
  5. <i class="i-material-symbols:add mr-4 text-18" />
  6. 新增子菜单
  7. </NButton>
  8. </template>
  9. <MeCrud ref="$table" v-model:query-items="queryItems" :scroll-x="1200" :columns="columns" :get-data="api.read">
  10. <MeQueryItem label="标题" :label-width="50">
  11. <n-input v-model:value="queryItems.title" type="text" placeholder="请输入标题名" clearable>
  12. <template #password-visible-icon />
  13. </n-input>
  14. </MeQueryItem>
  15. <MeQueryItem label="状态" :label-width="50">
  16. <n-select
  17. v-model:value="queryItems.enable" clearable :options="[
  18. { label: '启用', value: 1 },
  19. { label: '停用', value: 0 },
  20. ]"
  21. />
  22. </MeQueryItem>
  23. </MeCrud>
  24. </CommonPage>
  25. </template>
  26. <script setup>
  27. import { MeCrud, MeQueryItem } from '@/components'
  28. import { useCrud } from '@/composables'
  29. import { formatDateTime } from '@/utils'
  30. import { NButton, NSwitch } from 'naive-ui'
  31. import { useRoute, useRouter } from 'vue-router'
  32. import api from './api.js'
  33. const $table = ref(null)
  34. const router = useRouter()
  35. const route = useRoute()
  36. const detail = ref({
  37. title: '',
  38. id: null,
  39. })
  40. /** QueryBar筛选参数(可选) */
  41. const queryItems = ref({
  42. parentId: route.params.id,
  43. })
  44. const { handleDelete, handleEdit }
  45. = useCrud({
  46. name: '文章',
  47. doCreate: api.create,
  48. doDelete: api.delete,
  49. doUpdate: api.update,
  50. initForm: { enable: true },
  51. refresh: (_, keepCurrentPage) => $table.value?.handleSearch(keepCurrentPage),
  52. })
  53. async function getMenuDetail() {
  54. const { data } = await api.getOne(route.params.id)
  55. if (data) {
  56. console.log('data', data)
  57. detail.value = data
  58. }
  59. }
  60. const columns = [
  61. { title: '标题名', key: 'title', width: '200' },
  62. { title: '分类', key: 'category.title' },
  63. {
  64. title: '创建时间',
  65. key: 'createTime',
  66. render: row => h('span', formatDateTime(row.createTime)),
  67. },
  68. {
  69. title: '状态',
  70. key: 'enable',
  71. render: row =>
  72. h(
  73. NSwitch,
  74. {
  75. size: 'small',
  76. rubberBand: false,
  77. value: row.enable,
  78. loading: !!row.enableLoading,
  79. disabled: row.code === 'SUPER_ADMIN',
  80. onUpdateValue: () => handleEnable(row),
  81. },
  82. {
  83. checked: () => '启用',
  84. unchecked: () => '停用',
  85. },
  86. ),
  87. },
  88. {
  89. title: '操作',
  90. key: 'actions',
  91. width: 200,
  92. align: 'center',
  93. fixed: 'right',
  94. render(row) {
  95. return [
  96. h(
  97. NButton,
  98. {
  99. size: 'small',
  100. type: 'primary',
  101. style: 'margin-left: 12px;',
  102. disabled: row.code === 'SUPER_ADMIN',
  103. onClick: () => handleEdit(row),
  104. },
  105. {
  106. default: () => '编辑',
  107. icon: () => h('i', { class: 'i-material-symbols:edit-outline text-14' }),
  108. },
  109. ),
  110. h(
  111. NButton,
  112. {
  113. size: 'small',
  114. type: 'error',
  115. style: 'margin-left: 12px;',
  116. disabled: row.code === 'SUPER_ADMIN',
  117. onClick: () => handleDelete(row.id),
  118. },
  119. {
  120. default: () => '删除',
  121. icon: () => h('i', { class: 'i-material-symbols:delete-outline text-14' }),
  122. },
  123. ),
  124. ]
  125. },
  126. },
  127. ]
  128. async function handleEnable(row) {
  129. row.enableLoading = true
  130. try {
  131. await api.update({ id: row.id, enable: !row.enable })
  132. row.enableLoading = false
  133. $message.success('操作成功')
  134. $table.value?.handleSearch()
  135. }
  136. catch (error) {
  137. console.error(error)
  138. row.enableLoading = false
  139. }
  140. }
  141. onMounted(() => {
  142. $table.value?.handleSearch()
  143. getMenuDetail()
  144. })
  145. </script>