form.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import ReCol from "@/components/ReCol";
  4. import { formRules } from "./utils/rule";
  5. import { FormProps } from "./utils/types";
  6. import { transformI18n } from "@/plugins/i18n";
  7. import { IconSelect } from "@/components/ReIcon";
  8. import Segmented from "@/components/ReSegmented";
  9. import ReAnimateSelector from "@/components/ReAnimateSelector";
  10. import {
  11. menuTypeOptions,
  12. showLinkOptions,
  13. fixedTagOptions,
  14. keepAliveOptions,
  15. hiddenTagOptions,
  16. showParentOptions,
  17. frameLoadingOptions
  18. } from "./utils/enums";
  19. const props = withDefaults(defineProps<FormProps>(), {
  20. formInline: () => ({
  21. menuType: 0,
  22. higherMenuOptions: [],
  23. parentId: 0,
  24. title: "",
  25. name: "",
  26. path: "",
  27. component: "",
  28. rank: 99,
  29. redirect: "",
  30. icon: "",
  31. extraIcon: "",
  32. enterTransition: "",
  33. leaveTransition: "",
  34. activePath: "",
  35. auths: "",
  36. frameSrc: "",
  37. frameLoading: true,
  38. keepAlive: false,
  39. hiddenTag: false,
  40. fixedTag: false,
  41. showLink: true,
  42. showParent: false
  43. })
  44. });
  45. const ruleFormRef = ref();
  46. const newFormInline = ref(props.formInline);
  47. function getRef() {
  48. return ruleFormRef.value;
  49. }
  50. defineExpose({ getRef });
  51. </script>
  52. <template>
  53. <el-form
  54. ref="ruleFormRef"
  55. :model="newFormInline"
  56. :rules="formRules"
  57. label-width="82px"
  58. >
  59. <el-row :gutter="30">
  60. <re-col>
  61. <el-form-item label="菜单类型">
  62. <Segmented
  63. v-model="newFormInline.menuType"
  64. :options="menuTypeOptions"
  65. />
  66. </el-form-item>
  67. </re-col>
  68. <re-col>
  69. <el-form-item label="上级菜单">
  70. <el-cascader
  71. v-model="newFormInline.parentId"
  72. class="w-full"
  73. :options="newFormInline.higherMenuOptions"
  74. :props="{
  75. value: 'id',
  76. label: 'title',
  77. emitPath: false,
  78. checkStrictly: true
  79. }"
  80. clearable
  81. filterable
  82. placeholder="请选择上级菜单"
  83. >
  84. <template #default="{ node, data }">
  85. <span>{{ transformI18n(data.title) }}</span>
  86. <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
  87. </template>
  88. </el-cascader>
  89. </el-form-item>
  90. </re-col>
  91. <re-col :value="12" :xs="24" :sm="24">
  92. <el-form-item label="菜单名称" prop="title">
  93. <el-input
  94. v-model="newFormInline.title"
  95. clearable
  96. placeholder="请输入菜单名称"
  97. />
  98. </el-form-item>
  99. </re-col>
  100. <re-col v-if="newFormInline.menuType !== 3" :value="12" :xs="24" :sm="24">
  101. <el-form-item label="路由名称" prop="name">
  102. <el-input
  103. v-model="newFormInline.name"
  104. clearable
  105. placeholder="请输入路由名称"
  106. />
  107. </el-form-item>
  108. </re-col>
  109. <re-col v-if="newFormInline.menuType !== 3" :value="12" :xs="24" :sm="24">
  110. <el-form-item label="路由路径" prop="path">
  111. <el-input
  112. v-model="newFormInline.path"
  113. clearable
  114. placeholder="请输入路由路径"
  115. />
  116. </el-form-item>
  117. </re-col>
  118. <re-col
  119. v-show="newFormInline.menuType === 0"
  120. :value="12"
  121. :xs="24"
  122. :sm="24"
  123. >
  124. <el-form-item label="组件路径">
  125. <el-input
  126. v-model="newFormInline.component"
  127. clearable
  128. placeholder="请输入组件路径"
  129. />
  130. </el-form-item>
  131. </re-col>
  132. <re-col :value="12" :xs="24" :sm="24">
  133. <el-form-item label="菜单排序">
  134. <el-input-number
  135. v-model="newFormInline.rank"
  136. class="w-full!"
  137. :min="1"
  138. :max="9999"
  139. controls-position="right"
  140. />
  141. </el-form-item>
  142. </re-col>
  143. <re-col
  144. v-show="newFormInline.menuType === 0"
  145. :value="12"
  146. :xs="24"
  147. :sm="24"
  148. >
  149. <el-form-item label="路由重定向">
  150. <el-input
  151. v-model="newFormInline.redirect"
  152. clearable
  153. placeholder="请输入默认跳转地址"
  154. />
  155. </el-form-item>
  156. </re-col>
  157. <re-col
  158. v-show="newFormInline.menuType !== 3"
  159. :value="12"
  160. :xs="24"
  161. :sm="24"
  162. >
  163. <el-form-item label="菜单图标">
  164. <IconSelect v-model="newFormInline.icon" class="w-full" />
  165. </el-form-item>
  166. </re-col>
  167. <re-col
  168. v-show="newFormInline.menuType !== 3"
  169. :value="12"
  170. :xs="24"
  171. :sm="24"
  172. >
  173. <el-form-item label="右侧图标">
  174. <el-input
  175. v-model="newFormInline.extraIcon"
  176. clearable
  177. placeholder="菜单名称右侧的额外图标"
  178. />
  179. </el-form-item>
  180. </re-col>
  181. <re-col v-show="newFormInline.menuType < 2" :value="12" :xs="24" :sm="24">
  182. <el-form-item label="进场动画">
  183. <ReAnimateSelector
  184. v-model="newFormInline.enterTransition"
  185. placeholder="请选择页面进场加载动画"
  186. />
  187. </el-form-item>
  188. </re-col>
  189. <re-col v-show="newFormInline.menuType < 2" :value="12" :xs="24" :sm="24">
  190. <el-form-item label="离场动画">
  191. <ReAnimateSelector
  192. v-model="newFormInline.leaveTransition"
  193. placeholder="请选择页面离场加载动画"
  194. />
  195. </el-form-item>
  196. </re-col>
  197. <re-col
  198. v-show="newFormInline.menuType === 0"
  199. :value="12"
  200. :xs="24"
  201. :sm="24"
  202. >
  203. <el-form-item label="菜单激活">
  204. <el-input
  205. v-model="newFormInline.activePath"
  206. clearable
  207. placeholder="请输入需要激活的菜单"
  208. />
  209. </el-form-item>
  210. </re-col>
  211. <re-col v-if="newFormInline.menuType === 3" :value="12" :xs="24" :sm="24">
  212. <!-- 按钮级别权限设置 -->
  213. <el-form-item label="权限标识" prop="auths">
  214. <el-input
  215. v-model="newFormInline.auths"
  216. clearable
  217. placeholder="请输入权限标识"
  218. />
  219. </el-form-item>
  220. </re-col>
  221. <re-col
  222. v-show="newFormInline.menuType === 1"
  223. :value="12"
  224. :xs="24"
  225. :sm="24"
  226. >
  227. <!-- iframe -->
  228. <el-form-item label="链接地址">
  229. <el-input
  230. v-model="newFormInline.frameSrc"
  231. clearable
  232. placeholder="请输入 iframe 链接地址"
  233. />
  234. </el-form-item>
  235. </re-col>
  236. <re-col v-if="newFormInline.menuType === 1" :value="12" :xs="24" :sm="24">
  237. <el-form-item label="加载动画">
  238. <Segmented
  239. :modelValue="newFormInline.frameLoading ? 0 : 1"
  240. :options="frameLoadingOptions"
  241. @change="
  242. ({ option: { value } }) => {
  243. newFormInline.frameLoading = value;
  244. }
  245. "
  246. />
  247. </el-form-item>
  248. </re-col>
  249. <re-col
  250. v-show="newFormInline.menuType !== 3"
  251. :value="12"
  252. :xs="24"
  253. :sm="24"
  254. >
  255. <el-form-item label="菜单">
  256. <Segmented
  257. :modelValue="newFormInline.showLink ? 0 : 1"
  258. :options="showLinkOptions"
  259. @change="
  260. ({ option: { value } }) => {
  261. newFormInline.showLink = value;
  262. }
  263. "
  264. />
  265. </el-form-item>
  266. </re-col>
  267. <re-col
  268. v-show="newFormInline.menuType !== 3"
  269. :value="12"
  270. :xs="24"
  271. :sm="24"
  272. >
  273. <el-form-item label="父级菜单">
  274. <Segmented
  275. :modelValue="newFormInline.showParent ? 0 : 1"
  276. :options="showParentOptions"
  277. @change="
  278. ({ option: { value } }) => {
  279. newFormInline.showParent = value;
  280. }
  281. "
  282. />
  283. </el-form-item>
  284. </re-col>
  285. <re-col v-show="newFormInline.menuType < 2" :value="12" :xs="24" :sm="24">
  286. <el-form-item label="缓存页面">
  287. <Segmented
  288. :modelValue="newFormInline.keepAlive ? 0 : 1"
  289. :options="keepAliveOptions"
  290. @change="
  291. ({ option: { value } }) => {
  292. newFormInline.keepAlive = value;
  293. }
  294. "
  295. />
  296. </el-form-item>
  297. </re-col>
  298. <re-col v-show="newFormInline.menuType < 2" :value="12" :xs="24" :sm="24">
  299. <el-form-item label="标签页">
  300. <Segmented
  301. :modelValue="newFormInline.hiddenTag ? 1 : 0"
  302. :options="hiddenTagOptions"
  303. @change="
  304. ({ option: { value } }) => {
  305. newFormInline.hiddenTag = value;
  306. }
  307. "
  308. />
  309. </el-form-item>
  310. </re-col>
  311. <re-col v-show="newFormInline.menuType < 2" :value="12" :xs="24" :sm="24">
  312. <el-form-item label="固定标签页">
  313. <Segmented
  314. :modelValue="newFormInline.fixedTag ? 0 : 1"
  315. :options="fixedTagOptions"
  316. @change="
  317. ({ option: { value } }) => {
  318. newFormInline.fixedTag = value;
  319. }
  320. "
  321. />
  322. </el-form-item>
  323. </re-col>
  324. </el-row>
  325. </el-form>
  326. </template>