index.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. import {
  2. NButton,
  3. NModal,
  4. NSpace,
  5. NDataTable,
  6. useDialog,
  7. useMessage,
  8. NTag,
  9. NFormItem,
  10. NCascader
  11. } from 'naive-ui'
  12. import { defineComponent, onMounted, reactive, ref } from 'vue'
  13. import { sysApplicationPage, sysMenuPage, sysMenuRemove } from '../api'
  14. import MenuOperation from './menu-operation'
  15. import SaveForm from '@/components/save-form'
  16. import { formatDataList } from '@/utils/urlUtils'
  17. /*
  18. parentId 要结点
  19. path 路径
  20. name 名称
  21. component 组件名
  22. icon 图标
  23. type 菜单 | 按钮
  24. permission 权限
  25. parentPermission 高亮路径
  26. sort 菜单排序
  27. hidden 是否隐藏
  28. */
  29. export default defineComponent({
  30. name: 'menu-manage',
  31. setup() {
  32. const dialog = useDialog()
  33. const message = useMessage()
  34. const state = reactive({
  35. loading: false,
  36. applyList: [] as any,
  37. dataList: [] as any,
  38. visiableMenu: false,
  39. menuType: 'add',
  40. applyData: {} as any,
  41. expandedRowKeys: [],
  42. searchForm: {
  43. appId: null
  44. }
  45. })
  46. const columns = (): any => [
  47. {
  48. title: '菜单名称',
  49. key: 'name',
  50. width: 330,
  51. render(row: any) {
  52. return `${row.name} - ${row.id}`
  53. }
  54. },
  55. {
  56. title: '应用名称',
  57. key: 'appName'
  58. },
  59. {
  60. title: '组件名',
  61. key: 'component'
  62. },
  63. {
  64. title: '路由路径',
  65. key: 'path'
  66. },
  67. {
  68. title: '权限标识',
  69. key: 'permission'
  70. },
  71. {
  72. title: '排序',
  73. key: 'sort'
  74. },
  75. {
  76. title: '类型',
  77. key: 'type',
  78. render(row: any) {
  79. return row.type === '0' ? (
  80. <NTag type="primary">菜单</NTag>
  81. ) : (
  82. <NTag type="default">按钮</NTag>
  83. )
  84. }
  85. },
  86. {
  87. title: '操作',
  88. key: 'operation',
  89. render(row: any) {
  90. return (
  91. <NSpace>
  92. <NButton
  93. type="primary"
  94. text
  95. size="small"
  96. v-auth="sysMenu/update1674673366681837570"
  97. onClick={() => {
  98. state.visiableMenu = true
  99. state.menuType = 'edit'
  100. state.applyData = row
  101. }}
  102. >
  103. 编辑
  104. </NButton>
  105. <NButton
  106. type="primary"
  107. text
  108. size="small"
  109. v-auth="sysMenu/remove1674673513016909826"
  110. onClick={() => onRmove(row)}
  111. >
  112. 删除
  113. </NButton>
  114. </NSpace>
  115. )
  116. }
  117. }
  118. ]
  119. const onRmove = (row: any): void => {
  120. dialog.warning({
  121. title: '警告',
  122. content: `删除"${row.name}",是否继续?`,
  123. positiveText: '确定',
  124. negativeText: '取消',
  125. onPositiveClick: async () => {
  126. try {
  127. await sysMenuRemove({ id: row.id })
  128. getList()
  129. message.success('删除成功')
  130. } catch {}
  131. }
  132. })
  133. }
  134. const getList = async () => {
  135. try {
  136. state.loading = true
  137. // state.expandedRowKeys = []
  138. const { data } = await sysMenuPage({
  139. ...state.searchForm,
  140. parentId: 0,
  141. delFlag: false
  142. })
  143. state.loading = false
  144. const tempList = [] as any
  145. ;(data || []).forEach((item: any) => {
  146. item.isLeaf = item.children ? false : true
  147. tempList.push(item)
  148. })
  149. state.dataList = formatDataList(tempList)
  150. } catch {}
  151. }
  152. const getApplyList = async (parentId = 0) => {
  153. try {
  154. const { data } = await sysApplicationPage({
  155. page: 1,
  156. rows: 999,
  157. leafQuery: true,
  158. parentId
  159. })
  160. state.applyList = formatDataList(data.rows || [], 'bizApps')
  161. } catch {}
  162. }
  163. const saveForm = ref()
  164. const onSubmit = () => {
  165. getList()
  166. }
  167. const onSearch = () => {
  168. saveForm.value?.submit()
  169. }
  170. const onBtnReset = () => {
  171. saveForm.value?.reset()
  172. }
  173. onMounted(() => {
  174. getList()
  175. getApplyList()
  176. })
  177. return () => (
  178. <div class="system-menu-container">
  179. <SaveForm
  180. ref={saveForm}
  181. model={state.searchForm}
  182. onSubmit={onSubmit}
  183. onSetModel={(val: any) => (state.searchForm = val)}
  184. >
  185. <NFormItem label="应用" path="name">
  186. <NCascader
  187. v-model:value={state.searchForm.appId}
  188. options={state.applyList}
  189. showPath={true}
  190. allowCheckingNotLoaded={false}
  191. checkStrategy="child"
  192. valueField="id"
  193. labelField="appName"
  194. childrenField="bizApps"
  195. placeholder="请选择应用"
  196. expandTrigger="hover"
  197. clearable
  198. ></NCascader>
  199. </NFormItem>
  200. <NFormItem>
  201. <NSpace>
  202. <NButton type="primary" onClick={onSearch}>
  203. 搜索
  204. </NButton>
  205. <NButton type="default" onClick={onBtnReset}>
  206. 重置
  207. </NButton>
  208. </NSpace>
  209. </NFormItem>
  210. </SaveForm>
  211. <div class={['section-container']}>
  212. <NSpace style={{ paddingBottom: '12px' }} justify="space-between">
  213. <NButton
  214. type="primary"
  215. v-auth="sysMenu/save1597877997041733633"
  216. onClick={() => {
  217. state.menuType = 'add'
  218. state.applyData = []
  219. state.visiableMenu = true
  220. }}
  221. >
  222. 添加菜单
  223. </NButton>
  224. </NSpace>
  225. <NDataTable
  226. loading={state.loading}
  227. columns={columns()}
  228. data={state.dataList}
  229. allowCheckingNotLoaded
  230. cascade={false}
  231. virtualScroll
  232. maxHeight={400}
  233. expandedRowKeys={state.expandedRowKeys}
  234. onUpdateExpandedRowKeys={(keys: any) => {
  235. state.expandedRowKeys = keys
  236. }}
  237. rowKey={(row: any) => row.id}
  238. ></NDataTable>
  239. </div>
  240. <NModal
  241. v-model:show={state.visiableMenu}
  242. preset="dialog"
  243. showIcon={false}
  244. title={state.menuType === 'add' ? '添加菜单' : '修改菜单'}
  245. style={{ width: '700px' }}
  246. >
  247. <MenuOperation
  248. type={state.menuType}
  249. data={state.applyData}
  250. menuList={state.dataList}
  251. applyList={state.applyList}
  252. onClose={() => (state.visiableMenu = false)}
  253. onGetList={getList}
  254. />
  255. </NModal>
  256. </div>
  257. )
  258. }
  259. })