index.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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/update1597877909171064833"
  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/remove1597878074728632322"
  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. filterable
  199. ></NCascader>
  200. </NFormItem>
  201. <NFormItem>
  202. <NSpace>
  203. <NButton type="primary" onClick={onSearch}>
  204. 搜索
  205. </NButton>
  206. <NButton type="default" onClick={onBtnReset}>
  207. 重置
  208. </NButton>
  209. </NSpace>
  210. </NFormItem>
  211. </SaveForm>
  212. <div class={['section-container']}>
  213. <NSpace style={{ paddingBottom: '12px' }} justify="space-between">
  214. <NButton
  215. type="primary"
  216. //v-auth="sysMenu/save1597877997041733633"
  217. onClick={() => {
  218. state.menuType = 'add'
  219. state.applyData = []
  220. state.visiableMenu = true
  221. }}
  222. >
  223. 添加菜单
  224. </NButton>
  225. </NSpace>
  226. <NDataTable
  227. loading={state.loading}
  228. columns={columns()}
  229. data={state.dataList}
  230. allowCheckingNotLoaded
  231. cascade={false}
  232. virtualScroll
  233. maxHeight={400}
  234. expandedRowKeys={state.expandedRowKeys}
  235. onUpdateExpandedRowKeys={(keys: any) => {
  236. state.expandedRowKeys = keys
  237. }}
  238. rowKey={(row: any) => row.id}
  239. ></NDataTable>
  240. </div>
  241. <NModal
  242. v-model:show={state.visiableMenu}
  243. preset="dialog"
  244. showIcon={false}
  245. title={state.menuType === 'add' ? '添加菜单' : '修改菜单'}
  246. style={{ width: '700px' }}
  247. >
  248. <MenuOperation
  249. type={state.menuType}
  250. data={state.applyData}
  251. menuList={state.dataList}
  252. applyList={state.applyList}
  253. onClose={() => (state.visiableMenu = false)}
  254. onGetList={getList}
  255. />
  256. </NModal>
  257. </div>
  258. )
  259. }
  260. })