menu-top.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <template>
  2. <hc-new-card>
  3. <template #header>
  4. <div class="w-60">
  5. <hc-search-input v-model="searchForm.name" placeholder="请输入菜单名称" @search="searchClick" />
  6. </div>
  7. </template>
  8. <template #extra>
  9. <el-button hc-btn type="primary" @click="addClick">新增</el-button>
  10. <el-button hc-btn type="danger" @click="delClick">删除</el-button>
  11. </template>
  12. <hc-table
  13. ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading"
  14. :is-index="false" is-new is-check :check-style="{ width: 29 }"
  15. @selection-change="tableCheckChange"
  16. >
  17. <template #action="{ row }">
  18. <el-link type="warning" @click="editRowClick(row)">修改</el-link>
  19. <el-link type="danger" @click="delRowClick(row)">删除</el-link>
  20. </template>
  21. </hc-table>
  22. <template #action>
  23. <hc-pages :pages="searchForm" @change="pageChange" />
  24. </template>
  25. <!-- 新增/修改 菜单 -->
  26. <hc-new-dialog v-model="isDialogShow" widths="800px" is-footer-center :title="iconDialogTitle" @close="dialogClose">
  27. <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" label-width="auto">
  28. <el-row :gutter="20">
  29. <el-col :span="12">
  30. <el-form-item label="菜单名称:" prop="name">
  31. <el-input v-model="formModel.name" clearable />
  32. </el-form-item>
  33. </el-col>
  34. <el-col :span="12">
  35. <el-form-item label="跳转地址:" prop="code">
  36. <el-input v-model="formModel.code" clearable />
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="12">
  40. <el-form-item label="菜单图标:">
  41. <hc-icon-input v-model="formModel.source" />
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="12">
  45. <el-form-item label="菜单排序:" prop="sort">
  46. <el-input-number v-model="formModel.sort" :min="1" block controls-position="right" />
  47. </el-form-item>
  48. </el-col>
  49. </el-row>
  50. </el-form>
  51. <template #footer>
  52. <el-button hc-btn @click="dialogClose">取消</el-button>
  53. <el-button hc-btn type="primary" :loading="submitLoading" @click="dialogSubmit">提交</el-button>
  54. </template>
  55. </hc-new-dialog>
  56. </hc-new-card>
  57. </template>
  58. <script setup>
  59. import { nextTick, onActivated, ref } from 'vue'
  60. import { arrToId, formValidate, getArrValue } from 'js-fast-way'
  61. import { delMessage, reloadPage } from '~uti/tools'
  62. import mainApi from '~api/system/menu-top'
  63. //激活
  64. onActivated(() => {
  65. searchClick()
  66. })
  67. //搜索表单
  68. const searchForm = ref({ name: null, current: 1, size: 30, total: 0 })
  69. //搜索
  70. const searchClick = () => {
  71. searchForm.value.current = 1
  72. getTableData()
  73. }
  74. //分页
  75. const pageChange = ({ current, size }) => {
  76. searchForm.value.current = current
  77. searchForm.value.size = size
  78. getTableData()
  79. }
  80. //表格数据
  81. const tableRef = ref(null)
  82. const tableColumn = ref([
  83. { key: 'name', name: '菜单名称' },
  84. { key: 'code', name: '跳转地址' },
  85. { key: 'sort', name: '排序', width: 80, align: 'center' },
  86. { key: 'action', name: '操作', width: 200, align: 'center' },
  87. ])
  88. //获取表格数据
  89. const tableLoading = ref(false)
  90. const tableData = ref([{}])
  91. const getTableData = async () => {
  92. tableData.value = []
  93. tableLoading.value = true
  94. const { error, code, data } = await mainApi.page({
  95. ...searchForm.value,
  96. total: null,
  97. })
  98. tableLoading.value = false
  99. if (!error && code === 200) {
  100. tableData.value = getArrValue(data['records'])
  101. searchForm.value.total = data['total']
  102. } else {
  103. tableData.value = []
  104. searchForm.value.total = 0
  105. }
  106. }
  107. //表格被选择
  108. const tableCheckKeys = ref([])
  109. const tableCheckChange = (rows) => {
  110. tableCheckKeys.value = rows
  111. }
  112. //新增/修改 弹窗
  113. const isDialogShow = ref(false)
  114. const iconDialogTitle = ref('')
  115. //菜单表单
  116. const formRef = ref(null)
  117. const formModel = ref({})
  118. const formRules = {
  119. name: {
  120. required: true,
  121. trigger: 'blur',
  122. message: '请输入菜单名称',
  123. },
  124. code: {
  125. required: true,
  126. trigger: 'blur',
  127. message: '请输入跳转地址',
  128. },
  129. sort: {
  130. required: true,
  131. trigger: 'blur',
  132. message: '请输入菜单排序',
  133. },
  134. }
  135. //新增菜单
  136. const addClick = () => {
  137. iconDialogTitle.value = '新增菜单'
  138. formModel.value = {}
  139. //显示表单弹窗
  140. nextTick(() => {
  141. isDialogShow.value = true
  142. })
  143. }
  144. //修改菜单
  145. const editRowClick = (row) => {
  146. formModel.value = {}
  147. iconDialogTitle.value = '修改菜单'
  148. formModel.value = { ...row }
  149. //显示表单弹窗
  150. nextTick(() => {
  151. isDialogShow.value = true
  152. })
  153. }
  154. //删除菜单
  155. const delRowClick = (row) => {
  156. delMessage(async () => {
  157. const { code, msg } = await mainApi.del(row.id)
  158. if (code === 200) {
  159. window.$message.success('删除成功')
  160. reloadPage()
  161. } else {
  162. window.$message.error(msg ?? '删除失败')
  163. }
  164. })
  165. }
  166. //批量删除菜单
  167. const delClick = () => {
  168. const rows = tableCheckKeys.value
  169. if (rows.length <= 0) {
  170. window.$message.warning('请选择要删除的菜单')
  171. return false
  172. }
  173. //确认删除菜单
  174. delMessage(async () => {
  175. const ids = arrToId(rows)
  176. const { code, msg } = await mainApi.del(ids)
  177. if (code === 200) {
  178. window.$message.success('删除成功')
  179. reloadPage()
  180. } else {
  181. window.$message.error(msg ?? '删除失败')
  182. }
  183. })
  184. }
  185. //提交表单
  186. const submitLoading = ref(false)
  187. const dialogSubmit = async () => {
  188. const formRes = await formValidate(formRef.value)
  189. if (!formRes) return false
  190. submitLoading.value = true
  191. //发起请求
  192. const { error, code, msg } = await mainApi.submit(formModel.value)
  193. if (!error && code === 200) {
  194. submitLoading.value = false
  195. window?.$message?.success('操作成功')
  196. reloadPage()
  197. } else {
  198. window?.$message?.error(msg ?? '操作失败')
  199. }
  200. }
  201. //关闭弹窗
  202. const dialogClose = () => {
  203. isDialogShow.value = false
  204. submitLoading.value = false
  205. formModel.value = {}
  206. }
  207. </script>