data.config.ts 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. import type { VbenFormProps } from '#/adapter/form';
  2. import type { VxeGridProps } from '#/adapter/vxe-table';
  3. import { h } from 'vue';
  4. import { EnumApi, MenuApi } from '#/api';
  5. import { boolOptions, formatterStatus } from '#/api/model';
  6. import { Icon } from '#/components/icon';
  7. export const searchFormOptions: VbenFormProps = {
  8. schema: [
  9. {
  10. component: 'Input',
  11. fieldName: 'title',
  12. label: '标题',
  13. },
  14. {
  15. component: 'ApiSelect',
  16. fieldName: 'type',
  17. label: '菜单类型',
  18. componentProps: {
  19. api: {
  20. type: 'enum',
  21. params: EnumApi.EnumType.MenuType,
  22. },
  23. },
  24. },
  25. ],
  26. };
  27. export const gridOptions: VxeGridProps<MenuApi.RecordItem> = {
  28. toolbarConfig: {
  29. refresh: true,
  30. print: false,
  31. export: false,
  32. zoom: true,
  33. custom: true,
  34. },
  35. columns: [
  36. { title: '序号', type: 'seq', width: 50 },
  37. {
  38. align: 'left',
  39. field: 'title',
  40. title: '菜单名称',
  41. width: 200,
  42. treeNode: true,
  43. showOverflow: true,
  44. slots: {
  45. default: ({ row }) => {
  46. return row.icon
  47. ? h(
  48. 'span',
  49. {
  50. style: {
  51. display: 'flex',
  52. alignItems: 'center',
  53. },
  54. },
  55. [
  56. h(Icon, {
  57. icon: row.icon,
  58. }),
  59. h(
  60. 'span',
  61. {
  62. style: {
  63. paddingLeft: '6px',
  64. },
  65. },
  66. row.title,
  67. ),
  68. ],
  69. )
  70. : h('span', {}, row.title);
  71. },
  72. },
  73. },
  74. { align: 'left', field: 'path', title: '路由地址', width: 180 },
  75. { align: 'left', field: 'component', title: '组件' },
  76. {
  77. align: 'left',
  78. field: 'permission',
  79. title: '权限标识',
  80. width: 120,
  81. showOverflow: true,
  82. },
  83. {
  84. field: 'status',
  85. title: '状态',
  86. width: 60,
  87. formatter: formatterStatus,
  88. },
  89. { field: 'sort', title: '排序', width: 80 },
  90. {
  91. field: 'action',
  92. fixed: 'right',
  93. slots: { default: 'action' },
  94. title: '操作',
  95. width: 170,
  96. },
  97. ],
  98. height: 'auto',
  99. keepSource: true,
  100. pagerConfig: {
  101. enabled: false,
  102. },
  103. treeConfig: {
  104. rowField: 'id',
  105. childrenField: 'children',
  106. },
  107. proxyConfig: {
  108. ajax: {
  109. query: async ({ page }, formValues) => {
  110. return await MenuApi.getList({
  111. pageIndex: page.currentPage,
  112. pageSize: page.pageSize,
  113. ...formValues,
  114. });
  115. },
  116. },
  117. },
  118. };
  119. export const formOptions: VbenFormProps = {
  120. commonConfig: {
  121. componentProps: {
  122. class: 'w-full',
  123. labelWidth: 110,
  124. },
  125. },
  126. schema: [
  127. {
  128. component: 'ApiRadio',
  129. defaultValue: 0,
  130. componentProps: {
  131. api: {
  132. type: 'enum',
  133. params: EnumApi.EnumType.MenuType,
  134. },
  135. isBtn: true,
  136. },
  137. fieldName: 'type',
  138. label: '菜单类型',
  139. rules: 'required',
  140. },
  141. {
  142. component: 'Input',
  143. componentProps: {
  144. placeholder: '请输入路由名称',
  145. },
  146. fieldName: 'name',
  147. label: '路由名称',
  148. rules: 'required',
  149. dependencies: {
  150. show(values) {
  151. return [0, 1].includes(values.type);
  152. },
  153. triggerFields: ['type'],
  154. },
  155. },
  156. {
  157. component: 'Input',
  158. componentProps: {
  159. placeholder: '请输入路由地址',
  160. },
  161. fieldName: 'path',
  162. label: '路由地址',
  163. rules: 'required',
  164. dependencies: {
  165. triggerFields: ['type'],
  166. show(values) {
  167. return [0, 1].includes(values.type);
  168. },
  169. },
  170. },
  171. {
  172. component: 'Input',
  173. componentProps: {
  174. placeholder: '请输入组件路径',
  175. },
  176. dependencies: {
  177. show(values) {
  178. return [0, 1].includes(values.type);
  179. },
  180. triggerFields: ['type'],
  181. },
  182. fieldName: 'component',
  183. label: '组件路径',
  184. rules: 'required',
  185. },
  186. {
  187. component: 'Input',
  188. componentProps: {
  189. placeholder: '请输入重定向',
  190. },
  191. dependencies: {
  192. triggerFields: ['type'],
  193. show(values) {
  194. return [0, 1].includes(values.type);
  195. },
  196. },
  197. fieldName: 'redirect',
  198. label: '重定向',
  199. },
  200. {
  201. component: 'Input',
  202. componentProps: {
  203. placeholder: '请输入菜单名称',
  204. },
  205. fieldName: 'title',
  206. label: '菜单名称',
  207. rules: 'required',
  208. },
  209. {
  210. component: 'IconPicker',
  211. componentProps: {
  212. placeholder: '请输入图标',
  213. },
  214. fieldName: 'icon',
  215. label: '图标',
  216. rules: 'required',
  217. dependencies: {
  218. show(values) {
  219. return [0, 1].includes(values.type);
  220. },
  221. triggerFields: ['type'],
  222. },
  223. },
  224. {
  225. component: 'RadioGroup',
  226. defaultValue: 1,
  227. componentProps: {
  228. placeholder: '请输入',
  229. options: boolOptions,
  230. optionType: 'button',
  231. buttonStyle: 'solid',
  232. },
  233. dependencies: {
  234. triggerFields: ['type'],
  235. show(values) {
  236. return [1].includes(values.type);
  237. },
  238. },
  239. fieldName: 'keepAlive',
  240. label: '缓存',
  241. },
  242. {
  243. component: 'RadioGroup',
  244. defaultValue: 0,
  245. componentProps: {
  246. placeholder: '请输入',
  247. options: boolOptions,
  248. optionType: 'button',
  249. buttonStyle: 'solid',
  250. },
  251. dependencies: {
  252. triggerFields: ['type'],
  253. show(values) {
  254. return [0, 1].includes(values.type);
  255. },
  256. },
  257. fieldName: 'hideInTab',
  258. label: '隐藏',
  259. },
  260. {
  261. component: 'ApiSelect',
  262. componentProps: {
  263. placeholder: '请输入',
  264. api: {
  265. type: 'enum',
  266. params: EnumApi.EnumType.PathType,
  267. },
  268. },
  269. dependencies: {
  270. triggerFields: ['type'],
  271. show(values) {
  272. return [0, 1].includes(values.type);
  273. },
  274. },
  275. fieldName: 'pathType',
  276. label: '路由类型',
  277. rules: 'required',
  278. },
  279. {
  280. component: 'InputNumber',
  281. componentProps: {
  282. placeholder: '请输入',
  283. },
  284. fieldName: 'sort',
  285. label: '排序',
  286. rules: 'required',
  287. },
  288. {
  289. component: 'Input',
  290. componentProps: {
  291. placeholder: '请输入',
  292. },
  293. dependencies: {
  294. show(values) {
  295. return [2].includes(values.type);
  296. },
  297. triggerFields: ['type'],
  298. },
  299. fieldName: 'permission',
  300. label: '权限标识',
  301. },
  302. {
  303. component: 'ApiRadio',
  304. defaultValue: 1,
  305. componentProps: {
  306. placeholder: '请输入',
  307. api: {
  308. type: 'enum',
  309. params: EnumApi.EnumType.Status,
  310. },
  311. isBtn: true,
  312. },
  313. fieldName: 'status',
  314. label: '状态',
  315. },
  316. ],
  317. showDefaultActions: false,
  318. wrapperClass: 'grid-cols-1',
  319. };