list.hbs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <script lang="ts" setup name="{{ properCase componentName }}">
  2. import { ElMessage, ElMessageBox } from 'element-plus'
  3. import FormMode from './components/FormMode/index.vue'
  4. import eventBus from '@/utils/eventBus'
  5. import api from '@/api'
  6. import useSettingsStore from '@/store/modules/settings'
  7. const router = useRouter()
  8. const { pagination, getParams, onSizeChange, onCurrentChange, onSortChange } = usePagination()
  9. const tabbar = useTabbar()
  10. const settingsStore = useSettingsStore()
  11. const data = ref({
  12. loading: false,
  13. // 表格是否自适应高度
  14. tableAutoHeight: false,
  15. /**
  16. * 详情展示模式
  17. * router 路由跳转
  18. * dialog 对话框
  19. * drawer 抽屉
  20. */
  21. formMode: 'router',
  22. // 详情
  23. formModeProps: {
  24. visible: false,
  25. id: '',
  26. },
  27. // 搜索
  28. search: {
  29. title: '',
  30. },
  31. // 批量操作
  32. batch: {
  33. enable: false,
  34. selectionDataList: [],
  35. },
  36. // 列表数据
  37. dataList: [],
  38. })
  39. onMounted(() => {
  40. getDataList()
  41. if (data.value.formMode === 'router') {
  42. eventBus.on('get-data-list', () => {
  43. getDataList()
  44. })
  45. }
  46. })
  47. onBeforeUnmount(() => {
  48. if (data.value.formMode === 'router') {
  49. eventBus.off('get-data-list')
  50. }
  51. })
  52. function getDataList() {
  53. data.value.loading = true
  54. const params = getParams()
  55. data.value.search.title && (params.title = data.value.search.title)
  56. api.get('{{#if relativePath}}{{ relativePath }}/{{/if}}{{ snakeCase moduleName }}/list', {
  57. baseURL: '/mock/',
  58. params,
  59. }).then((res: any) => {
  60. data.value.loading = false
  61. data.value.dataList = res.data.list
  62. pagination.value.total = res.data.total
  63. })
  64. }
  65. // 每页数量切换
  66. function sizeChange(size: number) {
  67. onSizeChange(size).then(() => getDataList())
  68. }
  69. // 当前页码切换(翻页)
  70. function currentChange(page = 1) {
  71. onCurrentChange(page).then(() => getDataList())
  72. }
  73. // 字段排序
  74. function sortChange({ prop, order }: { prop: string; order: string }) {
  75. onSortChange(prop, order).then(() => getDataList())
  76. }
  77. function onCreate() {
  78. if (data.value.formMode === 'router') {
  79. if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
  80. tabbar.open({
  81. name: 'routerName',
  82. })
  83. }
  84. else {
  85. router.push({
  86. name: 'routerName',
  87. })
  88. }
  89. }
  90. else {
  91. data.value.formModeProps.id = ''
  92. data.value.formModeProps.visible = true
  93. }
  94. }
  95. function onEdit(row: any) {
  96. if (data.value.formMode === 'router') {
  97. if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
  98. tabbar.open({
  99. name: 'routerName',
  100. params: {
  101. id: row.id,
  102. },
  103. })
  104. }
  105. else {
  106. router.push({
  107. name: 'routerName',
  108. params: {
  109. id: row.id,
  110. },
  111. })
  112. }
  113. }
  114. else {
  115. data.value.formModeProps.id = row.id
  116. data.value.formModeProps.visible = true
  117. }
  118. }
  119. function onDel(row: any) {
  120. ElMessageBox.confirm(`确认删除「${row.title}」吗?`, '确认信息').then(() => {
  121. api.post('{{#if relativePath}}{{ relativePath }}/{{/if}}{{ snakeCase moduleName }}/delete', {
  122. id: row.id,
  123. }, {
  124. baseURL: '/mock/',
  125. }).then(() => {
  126. getDataList()
  127. ElMessage.success({
  128. message: '模拟删除成功',
  129. center: true,
  130. })
  131. })
  132. }).catch(() => {})
  133. }
  134. </script>
  135. <template>
  136. <div :class="{ 'absolute-container': data.tableAutoHeight }">
  137. <page-header title="{{ cname }}管理" />
  138. <page-main>
  139. <el-space wrap>
  140. <el-button type="primary" size="default" @click="onCreate">
  141. <template #icon>
  142. <el-icon>
  143. <svg-icon name="ep:plus" />
  144. </el-icon>
  145. </template>
  146. 新增{{ cname }}
  147. </el-button>
  148. <el-button v-if="data.batch.enable" size="default" :disabled="!data.batch.selectionDataList.length">
  149. 单个批量操作按钮
  150. </el-button>
  151. <el-button-group v-if="data.batch.enable">
  152. <el-button size="default" :disabled="!data.batch.selectionDataList.length">
  153. 批量操作按钮组1
  154. </el-button>
  155. <el-button size="default" :disabled="!data.batch.selectionDataList.length">
  156. 批量操作按钮组2
  157. </el-button>
  158. </el-button-group>
  159. </el-space>
  160. <search-bar>
  161. <el-form :model="data.search" size="default" label-width="100px" label-suffix=":">
  162. <el-row>
  163. <el-col :span="12">
  164. <el-form-item label="标题">
  165. <el-input v-model="data.search.title" placeholder="请输入标题,支持模糊查询" clearable @keydown.enter="currentChange()" @clear="currentChange()" />
  166. </el-form-item>
  167. </el-col>
  168. </el-row>
  169. <el-form-item>
  170. <el-button type="primary" @click="currentChange()">
  171. <template #icon>
  172. <el-icon>
  173. <svg-icon name="i-ep:search" />
  174. </el-icon>
  175. </template>
  176. 筛选
  177. </el-button>
  178. </el-form-item>
  179. </el-form>
  180. </search-bar>
  181. <el-table v-loading="data.loading" class="list-table" :data="data.dataList" border stripe highlight-current-row height="100%" @sort-change="sortChange" @selection-change="data.batch.selectionDataList = $event">
  182. <el-table-column v-if="data.batch.enable" type="selection" align="center" fixed />
  183. <el-table-column prop="title" label="标题" />
  184. <el-table-column label="操作" width="250" align="center" fixed="right">
  185. <template #default="scope">
  186. <el-button type="primary" size="small" plain @click="onEdit(scope.row)">
  187. 编辑
  188. </el-button>
  189. <el-button type="danger" size="small" plain @click="onDel(scope.row)">
  190. 删除
  191. </el-button>
  192. </template>
  193. </el-table-column>
  194. </el-table>
  195. <el-pagination :current-page="pagination.page" :total="pagination.total" :page-size="pagination.size" :page-sizes="pagination.sizes" :layout="pagination.layout" :hide-on-single-page="false" class="pagination" background @size-change="sizeChange" @current-change="currentChange" />
  196. </page-main>
  197. <FormMode v-if="['dialog', 'drawer'].includes(data.formMode)" :id="data.formModeProps.id" v-model="data.formModeProps.visible" :mode="data.formMode" @success="getDataList" />
  198. </div>
  199. </template>
  200. <style lang="scss" scoped>
  201. .absolute-container {
  202. position: absolute;
  203. width: 100%;
  204. height: 100%;
  205. display: flex;
  206. flex-direction: column;
  207. .page-header {
  208. margin-bottom: 0;
  209. }
  210. .page-main {
  211. // 让 page-main 的高度自适应
  212. flex: 1;
  213. overflow: auto;
  214. display: flex;
  215. flex-direction: column;
  216. .search-container {
  217. margin-bottom: 0;
  218. }
  219. }
  220. }
  221. </style>