index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. <script setup lang="ts" name="Menu">
  2. import apis from "@a"
  3. import message from "@@/utils/message"
  4. const { sys_normal_disable, sys_show_hide } = useDict("sys_normal_disable", "sys_show_hide")
  5. const tableRef = ref()
  6. const modalRef = ref()
  7. const iconShow = ref(false)
  8. const opts = reactive({
  9. columns: [
  10. { field: "menuId", name: "菜单ID", width: 100, isSort: true, visible: false },
  11. { field: "menuName", name: "菜单名称", visible: true },
  12. { field: "icon", name: "菜单图标", visible: true, width: 80 },
  13. { field: "path", name: "路由地址/按钮", visible: true, width: 120 },
  14. //{ field: "query", name: "路由参数", visible: true, width: 120 },
  15. { field: "component", name: "组件路径", visible: true },
  16. { field: "isFrame", name: "是否为外链", visible: true, width: 90 },
  17. { field: "isCache", name: "是否缓存", visible: true, width: 80 },
  18. { field: "menuType", name: "菜单类型", visible: true, width: 80 },
  19. { field: "visible", name: "菜单显示", visible: true, width: 80 },
  20. { field: "status", name: "菜单状态", visible: true, width: 80 },
  21. { field: "perms", name: "权限标识", visible: true },
  22. { field: "actions", name: `操作`, width: 150 }
  23. ] as any,
  24. queryParams: {
  25. menuName: undefined,
  26. visible: undefined,
  27. status: undefined
  28. },
  29. searchFormItems: [
  30. {
  31. field: "menuName",
  32. label: "菜单名称",
  33. class: "w-100",
  34. required: false,
  35. placeholder: "请输入菜单名称",
  36. listeners: {
  37. keyup: (e: KeyboardEvent) => {
  38. if (e.code == "Enter") {
  39. handleQuery()
  40. }
  41. }
  42. }
  43. },
  44. {
  45. field: "visible",
  46. label: "菜单显示",
  47. class: "w-100",
  48. required: false,
  49. component: "Dict",
  50. props: {
  51. placeholder: "请选择菜单显示",
  52. dictType: "sys_show_hide"
  53. }
  54. },
  55. {
  56. field: "status",
  57. label: "菜单状态",
  58. class: "w-100",
  59. required: false,
  60. component: "Dict",
  61. props: {
  62. placeholder: "请选择菜单状态",
  63. dictType: "sys_normal_disable"
  64. }
  65. }
  66. ] as any,
  67. permission: "system:menu",
  68. handleBtns: [
  69. {
  70. key: "handleUpdate",
  71. show: false
  72. },
  73. {
  74. key: "handleDelete",
  75. show: false
  76. }
  77. ],
  78. handleFuns: {
  79. handleCreate
  80. },
  81. customBtns: [],
  82. tableListFun: getTableData,
  83. getEntityFun: apis.system.menuApi.getMenu,
  84. deleteEntityFun: apis.system.menuApi.delMenu,
  85. modalTitle: "菜单",
  86. formRules: {
  87. menuName: [{ required: true, message: "菜单名称不能为空", trigger: "blur" }],
  88. orderNum: [{ required: true, message: "菜单顺序不能为空", trigger: "blur" }],
  89. path: [{ required: true, message: "路由地址不能为空", trigger: "blur" }]
  90. },
  91. labelWidth: "80px",
  92. emptyFormData: {
  93. parentId: 0,
  94. menuId: undefined,
  95. menuName: undefined,
  96. orderNum: undefined,
  97. path: undefined,
  98. component: undefined,
  99. query: undefined,
  100. isFrame: undefined,
  101. isCache: undefined,
  102. menuType: undefined,
  103. visible: "0",
  104. status: "0",
  105. perms: undefined,
  106. icon: undefined,
  107. btnClass: undefined,
  108. btnScript: undefined,
  109. remark: undefined
  110. }
  111. })
  112. const { queryParams, emptyFormData } = toRefs(opts)
  113. const form = ref<any>(emptyFormData.value)
  114. /** 搜索按钮操作 */
  115. function handleQuery(query?: any) {
  116. query = query || tableRef.value?.getQueryParams() || queryParams.value
  117. tableRef.value?.query(query)
  118. }
  119. /** 重置按钮操作 */
  120. function resetQuery() {
  121. //
  122. }
  123. const menuOptions = ref()
  124. const defaultBtnStyle = ref()
  125. function reset() {
  126. form.value = emptyFormData.value
  127. defaultBtnStyle.value = undefined
  128. getMenuTreeSelect()
  129. }
  130. /** 新增按钮操作 */
  131. function handleCreate(row: any) {
  132. reset()
  133. if (row != null && row.menuId) {
  134. form.value.parentId = row.menuId
  135. } else {
  136. form.value.parentId = 0
  137. }
  138. modalRef.value.changePrefixTitle("添加")
  139. modalRef.value.show()
  140. }
  141. /** 修改按钮操作 */
  142. function handleUpdate(row: any) {
  143. reset()
  144. if (row.menuId) {
  145. apis.system.menuApi.getMenu(row.menuId).then((res: any) => {
  146. form.value = res.data
  147. modalRef.value.changePrefixTitle("修改")
  148. modalRef.value.show()
  149. })
  150. }
  151. }
  152. function getMenuTreeSelect() {
  153. menuOptions.value = []
  154. apis.system.menuApi.listMenu({}).then((response) => {
  155. const menu: any = { menuId: 0, menuName: "主类目", children: [] }
  156. menu.children = handleTree(response.data, "menuId")
  157. menuOptions.value.push(menu)
  158. })
  159. }
  160. /** 提交按钮 */
  161. function submitForm() {
  162. if (form.value.menuId != null) {
  163. apis.system.menuApi.updateMenu(form.value).then(() => {
  164. message.msgSuccess("修改成功")
  165. handleQuery()
  166. })
  167. } else {
  168. apis.system.menuApi.addMenu(form.value).then(() => {
  169. message.msgSuccess("新增成功")
  170. handleQuery()
  171. })
  172. }
  173. }
  174. /** 删除按钮操作 */
  175. function handleDelete(row: any) {
  176. message
  177. .confirm('是否确认删除菜单为"' + row.menuName + '"的数据项?')
  178. .then(() => {
  179. return apis.system.menuApi.delMenu(row.menuId).then(() => {
  180. handleQuery()
  181. })
  182. })
  183. .catch(() => {
  184. //
  185. })
  186. }
  187. function defaultBtnChange(v: any) {
  188. switch (v) {
  189. case "A":
  190. form.value.btnClass = "btn btn-light-primary"
  191. form.value.btnScript = "handleCreate"
  192. break
  193. case "U":
  194. form.value.btnClass = "btn btn-light-success"
  195. form.value.btnScript = "handleUpdate@1"
  196. break
  197. case "D":
  198. form.value.btnClass = "btn btn-light-danger"
  199. form.value.btnScript = "handleDelete@0"
  200. break
  201. case "I":
  202. form.value.btnClass = "btn btn-light-warning"
  203. form.value.btnScript = "handleImport"
  204. break
  205. case "E":
  206. form.value.btnClass = "btn btn-light-info"
  207. form.value.btnScript = "handleExport"
  208. break
  209. case "H":
  210. form.value.btnClass = "btn btn-light"
  211. form.value.btnScript = "hide"
  212. break
  213. }
  214. }
  215. function getTableData(q: any) {
  216. return new Promise((resolve) => {
  217. apis.system.menuApi.listMenuByParentId(q).then((res) => {
  218. //res.data = handleTree(res.data, "menuId")
  219. resolve(res)
  220. })
  221. })
  222. }
  223. const showChooseIcon = ref(false)
  224. const iconSelectRef = ref()
  225. /** 展示下拉图标 */
  226. function showSelectIcon() {
  227. iconSelectRef.value?.reset()
  228. showChooseIcon.value = true
  229. }
  230. /** 选择图标 */
  231. function selected(name: string) {
  232. form.value.icon = name
  233. showChooseIcon.value = false
  234. }
  235. onMounted(() => {
  236. setTimeout(() => {
  237. iconShow.value = true
  238. }, 500)
  239. })
  240. </script>
  241. <template>
  242. <div>
  243. <VbDataTable
  244. ref="tableRef"
  245. :is-tree="true"
  246. :is-lazy="true"
  247. keyField="menuId"
  248. iconField="menuName"
  249. parentField="parentId"
  250. root-id="0"
  251. childrenField="children"
  252. leaf-field="leaf"
  253. :check-multiple="false"
  254. :has-checkbox="false"
  255. :no-page="true"
  256. :expand-depth="1"
  257. :interval-left="10"
  258. :show-search-bar="false"
  259. :show-right-search-btn="false"
  260. :show-right-column-btn="false"
  261. :handle-perm="opts.permission"
  262. :handle-btns="opts.handleBtns"
  263. :handle-funs="opts.handleFuns"
  264. :search-form-items="opts.searchFormItems"
  265. :columns="opts.columns"
  266. :custom-btns="opts.customBtns"
  267. :remote-fun="opts.tableListFun"
  268. v-model:query-params="queryParams"
  269. :reset-search-form-fun="resetQuery"
  270. :custom-search-fun="handleQuery">
  271. <template #icon="{ row }">
  272. <i :class="`fs-4 text-primary bi bi-${row.icon}`"></i>
  273. </template>
  274. <template #path="{ row }">
  275. <template v-if="row.menuType == 'F'">
  276. <template v-if="row.btnScript">
  277. <template v-if="row.btnClass">
  278. <div
  279. class="d-flex justify-content-center align-items-center w-100"
  280. style="transform: scale(0.7)">
  281. <span :class="row.btnClass">{{ row.btnScript }}</span>
  282. </div>
  283. </template>
  284. <template v-else>{{ row.btnScript }}</template>
  285. </template>
  286. <template v-else>{{ row.btnClass }}</template>
  287. </template>
  288. <template v-else>{{ row.path }}</template>
  289. </template>
  290. <template #component="{ row }">
  291. <template v-if="row.component">
  292. <vb-tooltip :content="row.component" :auto-hide="true"></vb-tooltip>
  293. </template>
  294. <span v-else class="text-muted">-</span>
  295. </template>
  296. <template #query="{ row }">
  297. <template v-if="row.query">
  298. <vb-tooltip :content="row.query" :auto-hide="true"></vb-tooltip>
  299. </template>
  300. <span v-else class="text-muted">-</span>
  301. </template>
  302. <template #perms="{ row }">
  303. <template v-if="row.perms">
  304. <vb-tooltip :content="row.perms" :auto-hide="true"></vb-tooltip>
  305. </template>
  306. <span v-else class="text-muted">-</span>
  307. </template>
  308. <template #menuType="{ row }">
  309. <vb-tag
  310. :data="[
  311. { label: '目录', value: 'M', type: 'primary' },
  312. { label: '菜单', value: 'C', type: 'success' },
  313. { label: '按钮', value: 'F', type: 'warning' }
  314. ]"
  315. :value="row.menuType"></vb-tag>
  316. </template>
  317. <template #isCache="{ row }">
  318. <vb-tag
  319. :data="[
  320. { label: '是', value: '0', type: 'primary' },
  321. { label: '否', value: '1', type: 'danger' }
  322. ]"
  323. :value="row.isCache"></vb-tag>
  324. </template>
  325. <template #isFrame="{ row }">
  326. <vb-tag
  327. :data="[
  328. { label: '是', value: '0', type: 'primary' },
  329. { label: '否', value: '1', type: 'danger' }
  330. ]"
  331. :value="row.isFrame"></vb-tag>
  332. </template>
  333. <template #visible="{ row }">
  334. <DictTag type="sys_show_hide" :value="row.visible"></DictTag>
  335. </template>
  336. <template #status="{ row }">
  337. <DictTag type="sys_normal_disable" :value="row.status"></DictTag>
  338. </template>
  339. <template #actions="{ row }">
  340. <vb-tooltip content="新增" placement="top">
  341. <el-button
  342. link
  343. type="primary"
  344. @click="handleCreate(row)"
  345. v-hasPermission="'system:menu:add'">
  346. <template #icon>
  347. <VbIcon icon-name="plus-square" icon-type="duotone" class="fs-3"></VbIcon>
  348. </template>
  349. </el-button>
  350. </vb-tooltip>
  351. <vb-tooltip content="修改" placement="top">
  352. <el-button
  353. link
  354. type="primary"
  355. @click="handleUpdate(row)"
  356. v-hasPermission="'system:menu:edit'">
  357. <template #icon>
  358. <VbIcon icon-name="notepad-edit" icon-type="duotone" class="fs-3"></VbIcon>
  359. </template>
  360. </el-button>
  361. </vb-tooltip>
  362. <vb-tooltip content="删除" placement="top">
  363. <el-button
  364. link
  365. type="primary"
  366. @click="handleDelete(row)"
  367. v-hasPermission="'system:menu:remove'">
  368. <template #icon>
  369. <VbIcon icon-name="trash-square" icon-type="duotone" class="fs-3"></VbIcon>
  370. </template>
  371. </el-button>
  372. </vb-tooltip>
  373. </template>
  374. </VbDataTable>
  375. <VbModal
  376. v-model:modal="modalRef"
  377. :title="opts.modalTitle"
  378. :form-data="form"
  379. :form-rules="opts.formRules"
  380. :label-width="opts.labelWidth"
  381. :hide-event="() => (showChooseIcon = false)"
  382. @confirm="submitForm"
  383. append-to-body>
  384. <template #form>
  385. <el-row>
  386. <el-col :span="24">
  387. <el-form-item label="上级菜单" prop="parentId">
  388. <el-tree-select
  389. v-model="form.parentId"
  390. class="w-100"
  391. :data="menuOptions"
  392. :props="{ value: 'menuId', label: 'menuName', children: 'children' }"
  393. value-key="menuId"
  394. placeholder="选择上级菜单"
  395. check-strictly />
  396. </el-form-item>
  397. </el-col>
  398. <el-col :span="24">
  399. <el-form-item label="菜单类型" prop="menuType">
  400. <el-radio-group v-model="form.menuType">
  401. <el-radio label="M">目录</el-radio>
  402. <el-radio label="C">菜单</el-radio>
  403. <el-radio label="F">按钮</el-radio>
  404. </el-radio-group>
  405. </el-form-item>
  406. </el-col>
  407. <el-col :span="24" v-if="iconShow">
  408. <!-- <el-form-item label="菜单图标" prop="icon">
  409. <el-popover
  410. placement="bottom-start"
  411. :width="600"
  412. v-model:visible="showChooseIcon"
  413. trigger="focus"
  414. @show="showSelectIcon">
  415. <template #reference>
  416. <el-input
  417. v-model="form.icon"
  418. placeholder="点击选择图标"
  419. @blur="showChooseIcon = true"
  420. @focus="showChooseIcon = true"
  421. readonly>
  422. <template #prefix>
  423. <i v-if="form.icon" :class="`text-primary bi bi-${form.icon}`"></i>
  424. <i v-else class="text-muted bi bi-search"></i>
  425. </template>
  426. </el-input>
  427. </template>
  428. <icon-select ref="iconSelectRef" @selected="selected" :active-icon="form.icon" />
  429. </el-popover>
  430. </el-form-item> -->
  431. <el-form-item label="菜单图标" prop="icon">
  432. <el-input v-model="form.icon" placeholder="请输入菜单图标" class="w-100" />
  433. </el-form-item>
  434. </el-col>
  435. <el-col :span="12">
  436. <el-form-item label="菜单名称" prop="menuName">
  437. <el-input v-model="form.menuName" placeholder="请输入菜单名称" class="w-100" />
  438. </el-form-item>
  439. </el-col>
  440. <el-col :span="12">
  441. <el-form-item label="显示顺序" prop="orderNum">
  442. <el-input-number v-model="form.orderNum" placeholder="请输入显示顺序" class="w-100" />
  443. </el-form-item>
  444. </el-col>
  445. <el-col :span="12" v-if="form.menuType != 'M'">
  446. <el-form-item label="权限标识" prop="perms">
  447. <template #label>
  448. <span>
  449. <vb-tooltip
  450. :width="320"
  451. content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)"
  452. placement="top">
  453. <span class="bi bi-question-circle-fill text-muted"></span>
  454. </vb-tooltip>
  455. 权限字符
  456. </span>
  457. </template>
  458. <el-input v-model="form.perms" placeholder="请输入权限标识" class="w-100" />
  459. </el-form-item>
  460. </el-col>
  461. <el-col :span="24" v-if="form.menuType == 'F'">
  462. <el-form-item label="常用样式">
  463. <template #label>
  464. <span>
  465. <vb-tooltip
  466. :width="320"
  467. content="列举了几种常用样式脚本,方便快捷的设置按钮样式及按钮脚本"
  468. placement="top">
  469. <span class="bi bi-question-circle-fill text-muted"></span>
  470. </vb-tooltip>
  471. 常用样式
  472. </span>
  473. </template>
  474. <el-radio-group v-model="defaultBtnStyle" @change="defaultBtnChange">
  475. <el-radio label="A">
  476. <span class="btn btn-light-primary" style="transform: scale(0.7)">新增</span>
  477. </el-radio>
  478. <el-radio label="U">
  479. <span class="btn btn-light-success" style="transform: scale(0.7)">编辑</span>
  480. </el-radio>
  481. <el-radio label="D">
  482. <span class="btn btn-light-danger" style="transform: scale(0.7)">删除</span>
  483. </el-radio>
  484. <el-radio label="I">
  485. <span class="btn btn-light-warning" style="transform: scale(0.7)">导入</span>
  486. </el-radio>
  487. <el-radio label="E">
  488. <span class="btn btn-light-info" style="transform: scale(0.7)">导出</span>
  489. </el-radio>
  490. <el-radio label="H">
  491. <span class="btn btn-light" style="transform: scale(0.7)">隐藏</span>
  492. </el-radio>
  493. </el-radio-group>
  494. </el-form-item>
  495. </el-col>
  496. <el-col :span="12" v-if="form.menuType == 'F'">
  497. <el-form-item label="按钮样式" prop="btnClass">
  498. <template #label>
  499. <span>
  500. <vb-tooltip content="按钮在toolbar中的显示样式 class" placement="top">
  501. <span class="bi bi-question-circle-fill text-muted"></span>
  502. </vb-tooltip>
  503. 按钮样式
  504. </span>
  505. </template>
  506. <el-input v-model="form.btnClass" placeholder="请输入按钮样式" class="w-100" />
  507. </el-form-item>
  508. </el-col>
  509. <el-col :span="12" v-if="form.menuType == 'F'">
  510. <el-form-item label="按钮脚本" prop="btnScript">
  511. <template #label>
  512. <span>
  513. <vb-tooltip
  514. :width="320"
  515. content="点击按钮调用的方法名,前端需要向table组件内传此方法名为key的方法。[handleCreate]、[handleUpdate]、[handleDelete]、[handleExport]脚本在table组件内置了。注:设置为'hide'值会隐藏按钮。"
  516. placement="top">
  517. <span class="bi bi-question-circle-fill text-muted"></span>
  518. </vb-tooltip>
  519. 按钮脚本
  520. </span>
  521. </template>
  522. <el-input v-model="form.btnScript" placeholder="请输入按钮脚本" class="w-100" />
  523. </el-form-item>
  524. </el-col>
  525. <el-col :span="12" v-if="form.menuType != 'F'">
  526. <el-form-item label="路由地址" prop="path">
  527. <el-input v-model="form.path" placeholder="请输入路由地址" class="w-100" />
  528. </el-form-item>
  529. </el-col>
  530. <el-col :span="12" v-if="form.menuType != 'F'">
  531. <el-form-item label="是否为外链" prop="isFrame">
  532. <template #label>
  533. <span>
  534. <vb-tooltip content="选择是外链则路由地址需要以`http(s)://`开头" placement="top">
  535. <span class="bi bi-question-circle-fill text-muted"></span>
  536. </vb-tooltip>
  537. 是否外链
  538. </span>
  539. </template>
  540. <el-radio-group v-model="form.isFrame">
  541. <el-radio label="0">是</el-radio>
  542. <el-radio label="1">否</el-radio>
  543. </el-radio-group>
  544. </el-form-item>
  545. </el-col>
  546. <el-col :span="12" v-if="form.menuType == 'C'">
  547. <el-form-item label="组件路径" prop="component">
  548. <template #label>
  549. <span>
  550. <vb-tooltip
  551. :width="320"
  552. content="访问的组件路径,如:`system/user/index`,默认在`views`目录下"
  553. placement="top">
  554. <span class="bi bi-question-circle-fill text-muted"></span>
  555. </vb-tooltip>
  556. 组件路径
  557. </span>
  558. </template>
  559. <el-input v-model="form.component" placeholder="请输入组件路径" class="w-100" />
  560. </el-form-item>
  561. </el-col>
  562. <el-col :span="12" v-if="form.menuType == 'C'">
  563. <el-form-item>
  564. <el-input v-model="form.query" placeholder="请输入路由参数" maxlength="255" />
  565. <template #label>
  566. <span>
  567. <vb-tooltip
  568. content='访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`'
  569. placement="top">
  570. <span class="bi bi-question-circle-fill text-muted"></span>
  571. </vb-tooltip>
  572. 路由参数
  573. </span>
  574. </template>
  575. </el-form-item>
  576. </el-col>
  577. <el-col :span="12" v-if="form.menuType == 'C'">
  578. <el-form-item>
  579. <template #label>
  580. <span>
  581. <vb-tooltip
  582. content="选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致"
  583. placement="top">
  584. <span class="bi bi-question-circle-fill text-muted"></span>
  585. </vb-tooltip>
  586. 是否缓存
  587. </span>
  588. </template>
  589. <el-radio-group v-model="form.isCache">
  590. <el-radio label="0">缓存</el-radio>
  591. <el-radio label="1">不缓存</el-radio>
  592. </el-radio-group>
  593. </el-form-item>
  594. </el-col>
  595. <el-col :span="12" v-if="form.menuType != 'F'">
  596. <el-form-item>
  597. <template #label>
  598. <span>
  599. <vb-tooltip
  600. content="选择隐藏则路由将不会出现在侧边栏,但仍然可以访问"
  601. placement="top">
  602. <span class="bi bi-question-circle-fill text-muted"></span>
  603. </vb-tooltip>
  604. 显示状态
  605. </span>
  606. </template>
  607. <el-radio-group v-model="form.visible">
  608. <el-radio v-for="dict in sys_show_hide" :key="dict.value" :label="dict.value">
  609. {{ dict.label }}
  610. </el-radio>
  611. </el-radio-group>
  612. </el-form-item>
  613. </el-col>
  614. <el-col :span="12" v-if="form.menuType != 'F'">
  615. <el-form-item>
  616. <template #label>
  617. <span>
  618. <vb-tooltip
  619. content="选择停用则路由将不会出现在侧边栏,也不能被访问"
  620. placement="top">
  621. <span class="bi bi-question-circle-fill text-muted"></span>
  622. </vb-tooltip>
  623. 菜单状态
  624. </span>
  625. </template>
  626. <el-radio-group v-model="form.status">
  627. <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">
  628. {{ dict.label }}
  629. </el-radio>
  630. </el-radio-group>
  631. </el-form-item>
  632. </el-col>
  633. <el-col :span="24">
  634. <el-form-item label="备注" prop="remark">
  635. <el-input
  636. v-model="form.remark"
  637. type="textarea"
  638. placeholder="请输入内容"
  639. class="w-100" />
  640. </el-form-item>
  641. </el-col>
  642. </el-row>
  643. </template>
  644. </VbModal>
  645. </div>
  646. </template>