index.vue 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. size="small"
  7. :inline="true"
  8. v-show="showSearch"
  9. >
  10. <el-form-item label="按钮组名" prop="btnGroupName">
  11. <el-input
  12. v-model="queryParams.btnGroupName"
  13. placeholder="请输入菜单名称"
  14. clearable
  15. @keyup.enter.native="handleQuery"
  16. />
  17. </el-form-item>
  18. <el-form-item>
  19. <el-button
  20. type="primary"
  21. icon="el-icon-search"
  22. size="mini"
  23. @click="handleQuery"
  24. >搜索</el-button
  25. >
  26. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  27. >重置</el-button
  28. >
  29. </el-form-item>
  30. </el-form>
  31. <el-row :gutter="10" class="mb8">
  32. <el-col :span="1.5">
  33. <el-button
  34. type="primary"
  35. plain
  36. icon="el-icon-plus"
  37. size="mini"
  38. @click="handleAdd"
  39. v-hasPermi="['system:menu:add']"
  40. >新增</el-button
  41. >
  42. </el-col>
  43. <el-col :span="1.5">
  44. <el-button
  45. type="info"
  46. plain
  47. icon="el-icon-sort"
  48. size="mini"
  49. @click="toggleExpandAll"
  50. >展开/折叠</el-button
  51. >
  52. </el-col>
  53. <right-toolbar
  54. :showSearch.sync="showSearch"
  55. @queryTable="getList"
  56. ></right-toolbar>
  57. </el-row>
  58. <el-table
  59. v-if="refreshTable"
  60. v-loading="loading"
  61. :data="btnList"
  62. row-key="id"
  63. :default-expand-all="isExpandAll"
  64. :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
  65. >
  66. <el-table-column
  67. prop="btnGroupName"
  68. label="按钮组名称"
  69. :show-overflow-tooltip="true"
  70. width="160"
  71. align="center"
  72. ></el-table-column>
  73. <el-table-column prop="btnIcon" label="图标" align="center" width="100">
  74. <template v-if="scope.row.btnIcon" slot-scope="scope">
  75. <svg-icon :icon-class="scope.row.btnIcon" />
  76. </template>
  77. </el-table-column>
  78. <el-table-column
  79. prop="btnName"
  80. label="按钮文字"
  81. align="center"
  82. ></el-table-column>
  83. <el-table-column
  84. prop="btnSort"
  85. label="排序"
  86. align="center"
  87. width="60"
  88. ></el-table-column>
  89. <el-table-column
  90. prop="btnHasPermi"
  91. label="权限标识"
  92. :show-overflow-tooltip="true"
  93. align="center"
  94. ></el-table-column>
  95. <el-table-column
  96. label="操作"
  97. align="center"
  98. class-name="small-padding fixed-width"
  99. >
  100. <template slot-scope="scope">
  101. <el-dropdown>
  102. <el-button type="warning" plain size="small">
  103. 处理<i class="el-icon-arrow-down el-icon--right"></i>
  104. </el-button>
  105. <el-dropdown-menu slot="dropdown">
  106. <el-dropdown-item
  107. ><el-button
  108. size="mini"
  109. type="text"
  110. icon="el-icon-edit"
  111. @click="handleUpdate(scope.row)"
  112. v-hasPermi="['system:menu:edit']"
  113. >修改</el-button
  114. ></el-dropdown-item
  115. >
  116. <el-dropdown-item v-if="scope.row.btnType == 'DIRECTORY'"
  117. ><el-button
  118. size="mini"
  119. type="text"
  120. icon="el-icon-plus"
  121. @click="handleAdd(scope.row)"
  122. v-hasPermi="['system:menu:add']"
  123. >新增</el-button
  124. ></el-dropdown-item
  125. >
  126. <el-dropdown-item
  127. ><el-button
  128. size="mini"
  129. type="text"
  130. icon="el-icon-delete"
  131. @click="handleDelete(scope.row)"
  132. v-hasPermi="['system:menu:remove']"
  133. >删除</el-button
  134. ></el-dropdown-item
  135. >
  136. </el-dropdown-menu>
  137. </el-dropdown>
  138. <!-- <el-button
  139. size="mini"
  140. type="text"
  141. icon="el-icon-edit"
  142. @click="handleUpdate(scope.row)"
  143. v-hasPermi="['system:menu:edit']"
  144. >修改</el-button>
  145. <el-button
  146. size="mini"
  147. type="text"
  148. icon="el-icon-plus"
  149. @click="handleAdd(scope.row)"
  150. v-hasPermi="['system:menu:add']"
  151. >新增</el-button>
  152. <el-button
  153. size="mini"
  154. type="text"
  155. icon="el-icon-delete"
  156. @click="handleDelete(scope.row)"
  157. v-hasPermi="['system:menu:remove']"
  158. >删除</el-button> -->
  159. </template>
  160. </el-table-column>
  161. </el-table>
  162. <!-- 添加或修改对话框 -->
  163. <el-dialog :title="title" :visible.sync="open" width="680px" append-to-body>
  164. <el-form
  165. ref="btnGroupFormRef"
  166. :model="btnGroupFormData"
  167. :rules="rules"
  168. label-width="100px"
  169. >
  170. <el-row type="flex" style="flex-wrap: wrap">
  171. <el-col :span="12">
  172. <el-form-item label="上级按钮" prop="btnParentId">
  173. <treeselect
  174. v-model="btnGroupFormData.btnParentId"
  175. :options="menuOptions"
  176. :normalizer="normalizer"
  177. :show-count="true"
  178. placeholder="选择上级按钮"
  179. />
  180. </el-form-item>
  181. </el-col>
  182. <el-col :span="24" v-if="btnGroupFormData.btnParentId == 0">
  183. <el-form-item label="按钮组名" prop="btnGroupName">
  184. <el-input
  185. v-model="btnGroupFormData.btnGroupName"
  186. placeholder=""
  187. size="normal"
  188. ></el-input>
  189. </el-form-item>
  190. </el-col>
  191. <el-col :span="12">
  192. <el-form-item label="按钮名" prop="btnName">
  193. <el-input
  194. v-model="btnGroupFormData.btnName"
  195. placeholder=""
  196. size="normal"
  197. ></el-input>
  198. </el-form-item>
  199. </el-col>
  200. <el-col :span="12">
  201. <el-form-item label="按钮图标" prop="btnIcon">
  202. <el-popover
  203. placement="bottom-start"
  204. width="460"
  205. trigger="click"
  206. @show="$refs['iconSelect'].reset()"
  207. >
  208. <IconSelect
  209. ref="iconSelect"
  210. @selected="selected"
  211. :active-icon="btnGroupFormData.icon"
  212. />
  213. <el-input
  214. slot="reference"
  215. v-model="btnGroupFormData.icon"
  216. placeholder="点击选择图标"
  217. readonly
  218. >
  219. <svg-icon
  220. v-if="btnGroupFormData.btnIcon"
  221. slot="prefix"
  222. :icon-class="btnGroupFormData.btnIcon"
  223. style="width: 25px"
  224. />
  225. <i
  226. v-else
  227. slot="prefix"
  228. class="el-icon-search el-input__icon"
  229. />
  230. </el-input>
  231. </el-popover>
  232. </el-form-item>
  233. </el-col>
  234. <el-col :span="12">
  235. <el-form-item label="排序" prop="btnSort">
  236. <el-input-number
  237. v-model="btnGroupFormData.btnSort"
  238. controls-position="right"
  239. :min="0"
  240. />
  241. </el-form-item>
  242. </el-col>
  243. <el-col :span="12">
  244. <el-form-item label="权限标识" prop="btnIcon">
  245. <el-input
  246. v-model="btnGroupFormData.btnHasPermi"
  247. placeholder="请输入权限标识"
  248. maxlength="100"
  249. />
  250. <span slot="label">
  251. <el-tooltip
  252. content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasPermi('system:user:list')`)"
  253. placement="top"
  254. >
  255. <i class="el-icon-question"></i>
  256. </el-tooltip>
  257. 权限字符
  258. </span>
  259. </el-form-item>
  260. </el-col>
  261. <el-col :span="12">
  262. <el-form-item label="按钮类型" prop="btnType">
  263. <el-select
  264. v-model="btnGroupFormData.btnType"
  265. placeholder="请选择按钮类型"
  266. filterable
  267. >
  268. <el-option
  269. v-for="item in btnTypeOptions"
  270. :key="item.value"
  271. :label="item.label"
  272. :value="item.value"
  273. >
  274. </el-option>
  275. </el-select>
  276. </el-form-item>
  277. </el-col>
  278. <!-- 非目录 -->
  279. <template v-if="btnGroupFormData.btnType != 'DIRECTORY'">
  280. <el-col
  281. :span="12"
  282. v-show="
  283. btnGroupFormData.btnType != 'DIRECTORY' &&
  284. btnGroupFormData.btnType != 'OUTLINK' &&
  285. btnGroupFormData.btnType != 'INNERLINK'
  286. "
  287. >
  288. <el-form-item label="绑定表单" prop="btnFormKey">
  289. <el-select
  290. v-model="btnGroupFormData.btnFormKey"
  291. placeholder="请选择表单"
  292. clearable
  293. filterable
  294. >
  295. <el-option
  296. v-for="item in formOptions"
  297. :key="item.fId"
  298. :label="item.dfName"
  299. :value="item.fId"
  300. >
  301. </el-option>
  302. </el-select>
  303. </el-form-item>
  304. </el-col>
  305. <el-col :span="12" v-show="btnGroupFormData.btnType == 'INITIATED'">
  306. <el-form-item label="执行流程" prop="btnProcessKey">
  307. <el-select
  308. v-model="btnGroupFormData.btnProcessKey"
  309. placeholder="请选择执行流程"
  310. clearable
  311. filterable
  312. >
  313. <el-option
  314. v-for="item in processOptions"
  315. :key="item.processKey"
  316. :label="item.processName"
  317. :value="item.processKey"
  318. >
  319. </el-option>
  320. </el-select>
  321. </el-form-item>
  322. </el-col>
  323. <el-col
  324. :span="12"
  325. v-show="
  326. btnGroupFormData.btnType == 'INSERT' ||
  327. btnGroupFormData.btnType == 'UPDATE' ||
  328. btnGroupFormData.btnType == 'DELETE'
  329. "
  330. >
  331. <el-form-item label="绑定表格" prop="btnTableKey">
  332. <el-select
  333. v-model="btnGroupFormData.btnTableKey"
  334. placeholder="请选择表格"
  335. clearable
  336. filterable
  337. >
  338. <el-option
  339. v-for="item in tableOptions"
  340. :key="item.tableKey"
  341. :label="item.dtName"
  342. :value="item.tableKey"
  343. >
  344. </el-option>
  345. </el-select>
  346. </el-form-item>
  347. </el-col>
  348. <el-col :span="12" v-show="btnGroupFormData.btnType == 'EXECUTE'">
  349. <el-form-item label="绑定脚本" prop="btnScriptKey">
  350. <el-select
  351. v-model="btnGroupFormData.btnScriptKey"
  352. placeholder="请选择绑定节点"
  353. clearable
  354. filterable
  355. >
  356. <el-option
  357. v-for="item in scriptOptions"
  358. :key="item.scriptKey"
  359. :label="item.scriptName"
  360. :value="item.scriptKey"
  361. >
  362. </el-option>
  363. </el-select>
  364. </el-form-item>
  365. </el-col>
  366. <el-col
  367. :span="24"
  368. v-show="
  369. btnGroupFormData.btnType == 3 || btnGroupFormData.btnType == 7
  370. "
  371. >
  372. <el-form-item label="跳转路由" prop="btnParams">
  373. <el-input
  374. v-model="btnGroupFormData.btnParams"
  375. placeholder="请输入跳转的路由地址"
  376. size="normal"
  377. ></el-input>
  378. </el-form-item>
  379. </el-col>
  380. <!-- <div class="table-wrap">
  381. <span class="title mb10">添加query参数</span>
  382. <el-table
  383. :data="queryTableData"
  384. border
  385. stripe
  386. style="width: 100%"
  387. >
  388. <el-table-column align="center" type="index" width="50" />
  389. <el-table-column
  390. v-for="col in columns"
  391. :prop="col.prop"
  392. :key="col.prop"
  393. :label="col.label"
  394. width="150"
  395. align="center"
  396. >
  397. <template slot-scope="scope">
  398. <el-input
  399. v-model="scope.row[col.prop]"
  400. placeholder=""
  401. size="normal"
  402. clearable
  403. ></el-input>
  404. </template>
  405. </el-table-column>
  406. <el-table-column label="操作" align="center">
  407. <template slot-scope="scope">
  408. <el-button
  409. size="mini"
  410. type="danger"
  411. icon="el-icon-delete"
  412. @click="deleteQueryItem(scope.$index)"
  413. >删除
  414. </el-button>
  415. </template>
  416. </el-table-column>
  417. </el-table>
  418. </div> -->
  419. <el-col :span="24">
  420. <!--
  421. v-show="
  422. btnGroupFormData.btnType != 3 && btnGroupFormData.btnType != 7
  423. " -->
  424. <!-- <el-form-item label="" prop="btnParams"> -->
  425. <div class="filter-table-wrap" style="width: 100%">
  426. <span class="title mb10"
  427. >{{
  428. btnGroupFormData.btnType != 3 &&
  429. btnGroupFormData.btnType != 7
  430. ? "公共"
  431. : "query"
  432. }}参数</span
  433. >
  434. <el-table :data="commonFieldData" style="width: 100%">
  435. <el-table-column label="序号" type="index" width="50">
  436. </el-table-column>
  437. <el-table-column
  438. prop="fieldName"
  439. label="字段名"
  440. width="150"
  441. align="center"
  442. >
  443. <template slot-scope="scope">
  444. <el-select
  445. v-model="scope.row.fieldName"
  446. placeholder="请选择"
  447. >
  448. <el-option
  449. v-for="item in rootFieldInfo.fieldList"
  450. :key="item.value"
  451. :label="item.value"
  452. :value="item.key"
  453. >
  454. <span style="float: left">{{ item.value }}</span>
  455. <span
  456. style="
  457. float: right;
  458. color: #8492a6;
  459. font-size: 13px;
  460. "
  461. >{{ item.key }}</span
  462. >
  463. </el-option>
  464. </el-select>
  465. </template>
  466. </el-table-column>
  467. <el-table-column
  468. prop="flagValue"
  469. label="默认值"
  470. width="150"
  471. align="center"
  472. >
  473. <template slot="header" slot-scope="">
  474. 默认值
  475. <el-tooltip
  476. class="item"
  477. effect="dark"
  478. content="不设置默认值时,默认为当前行的该字段"
  479. placement="top-start"
  480. >
  481. <i class="el-icon-info"></i>
  482. </el-tooltip>
  483. </template>
  484. <template slot-scope="scope">
  485. <!-- <el-button
  486. type="info"
  487. size="small"
  488. icon="el-icon-edit"
  489. @click="editFlagHandler(scope.row, scope.$index)"
  490. >
  491. </el-button> -->
  492. <el-input
  493. v-model="scope.row.fieldValue"
  494. placeholder="请输入默认值"
  495. size="normal"
  496. clearable
  497. >
  498. </el-input>
  499. </template>
  500. </el-table-column>
  501. <el-table-column label="操作" align="center">
  502. <template slot-scope="scope">
  503. <el-button
  504. size="mini"
  505. type="danger"
  506. icon="el-icon-delete"
  507. @click="deleteFilterItem(scope.$index)"
  508. >删除
  509. </el-button>
  510. </template>
  511. </el-table-column>
  512. </el-table>
  513. <el-button
  514. type="primary"
  515. class="inline-large-button mb10"
  516. icon="el-icon-plus"
  517. size="mini"
  518. style="width: 100%"
  519. @click="addFilterHandler"
  520. >
  521. 添加参数
  522. </el-button>
  523. </div>
  524. <!-- </el-form-item> -->
  525. </el-col>
  526. </template>
  527. </el-row>
  528. </el-form>
  529. <div slot="footer" class="dialog-footer">
  530. <el-button type="primary" @click="submitForm">确 定</el-button>
  531. <el-button @click="cancel">取 消</el-button>
  532. </div>
  533. </el-dialog>
  534. </div>
  535. </template>
  536. <script>
  537. import {
  538. listBtn,
  539. addBtn,
  540. getBtn,
  541. updateBtn,
  542. delBtn,
  543. checkBtn,
  544. } from "@/api/system/btn";
  545. import { listForm } from "@/api/dragform/form";
  546. import { listProcess } from "@/api/bpmprocess/process";
  547. import { listTable } from "@/api/dragform/tableList";
  548. import { listScript } from "@/api/bpmprocess/process";
  549. import Treeselect from "@riophae/vue-treeselect";
  550. import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  551. import IconSelect from "@/components/IconSelect";
  552. import { v4 as uuidv4 } from "uuid";
  553. import { dragTableInfo } from "@/api/tablelist/commonTable";
  554. import { camelCase } from "@/utils";
  555. export default {
  556. name: "ExcuteBtnMange",
  557. dicts: ["sys_show_hide", "sys_normal_disable"],
  558. components: { Treeselect, IconSelect },
  559. data() {
  560. return {
  561. // 记录编辑状态
  562. editType: true, //true:新增 false:修改
  563. // 遮罩层
  564. loading: true,
  565. // 显示搜索条件
  566. showSearch: true,
  567. // 菜单表格树数据
  568. btnList: [],
  569. // 菜单树选项
  570. menuOptions: [],
  571. // 弹出层标题
  572. title: "",
  573. // 是否显示弹出层
  574. open: false,
  575. // 是否展开,默认全部折叠
  576. isExpandAll: false,
  577. // 重新渲染表格状态
  578. refreshTable: true,
  579. // 查询参数
  580. queryParams: {
  581. btnParentId: 0,
  582. btnGroupName: "",
  583. pageNum: 1,
  584. pageSize: 10,
  585. },
  586. // 分页数据
  587. total: 0,
  588. // 表单参数
  589. form: {},
  590. // 表单校验
  591. rules: {
  592. btnParentId: [
  593. { required: true, message: "上级按钮不能为空", trigger: "change" },
  594. ],
  595. btnGroupName: [
  596. { required: true, message: "按钮组名不能为空", trigger: "blur" },
  597. ],
  598. btnSort: [{ required: true, message: "排序不能为空", trigger: "blur" }],
  599. btnType: [
  600. {
  601. required: true,
  602. message: "按钮类型不能为空",
  603. trigger: "change",
  604. },
  605. ],
  606. btnFormKey: [
  607. {
  608. validator: this.checkBtnFormKey,
  609. trigger: "change",
  610. },
  611. ],
  612. btnProcessKey: [
  613. {
  614. validator: this.checkBtnProcessKey,
  615. trigger: "change",
  616. },
  617. ],
  618. btnScriptKey: [
  619. {
  620. validator: this.checkBtnScriptKey,
  621. trigger: "change",
  622. },
  623. ],
  624. },
  625. // 按钮组表单数据
  626. btnGroupFormData: {
  627. btnGroupName: "", //按钮组名
  628. btnParentId: "", //父节点id
  629. btnName: "", //按钮显示的文字
  630. btnIcon: "", //按钮图标
  631. btnType: "DIRECTORY", //0:操作按钮,1,其他,2表单,3内链,4流程,5脚本, 6,目录, 7:外链
  632. btnFormKey: null, //表单唯一标识
  633. btnProcessKey: "", //流程唯一标识
  634. btnTableKey: "", //表格唯一标识
  635. btnScriptKey: "", //脚本唯一标识
  636. btnShowCondition: "", //按钮显示条件
  637. btnParams: "", //操作参数
  638. btnHasPermi: "", //权限字符
  639. btnSort: 0, //按钮顺序
  640. btnKey: "",
  641. },
  642. conditionBtnData: [],
  643. btnTypeOptions: [
  644. // {
  645. // value: 0,
  646. // label: "操作按钮",
  647. // },
  648. // {
  649. // value: 1,
  650. // label: "其它",
  651. // },
  652. // {
  653. // value: 2,
  654. // label: "表单",
  655. // },
  656. // {
  657. // value: 3,
  658. // label: "内链",
  659. // },
  660. // {
  661. // value: 4,
  662. // label: "流程",
  663. // },
  664. // {
  665. // value: 5,
  666. // label: "脚本",
  667. // },
  668. {
  669. // value: "6",
  670. value: "DIRECTORY",
  671. label: "目录",
  672. },
  673. {
  674. // value: "7",
  675. value: "OUTLINK",
  676. label: "外链",
  677. },
  678. {
  679. // value: "3",
  680. value: "INNERLINK",
  681. label: "内链",
  682. },
  683. {
  684. value: "INSERT",
  685. label: "新增",
  686. },
  687. {
  688. // value: "8",
  689. value: "UPDATE",
  690. label: "修改",
  691. },
  692. {
  693. value: "DELETE",
  694. label: "删除",
  695. },
  696. {
  697. value: "EXECUTE",
  698. label: "执行脚本",
  699. },
  700. {
  701. value: "INITIATED",
  702. label: "发起流程",
  703. },
  704. ],
  705. formOptions: [],
  706. tableOptions: [],
  707. processOptions: [],
  708. scriptOptions: [],
  709. // 普遍字段参数
  710. commonFieldData: [
  711. // {
  712. // fieldName: "",
  713. // fieldValue: "",
  714. // },
  715. ],
  716. rootFieldInfo: {
  717. tableName: "",
  718. fieldList: [],
  719. },
  720. queryTableData: [
  721. {
  722. key: "",
  723. value: "",
  724. },
  725. ],
  726. columns: [
  727. {
  728. label: "参数名",
  729. prop: "key",
  730. },
  731. {
  732. label: "值",
  733. prop: "value",
  734. },
  735. ],
  736. };
  737. },
  738. // created() {
  739. // this.getList();
  740. // this.initFormSubData();
  741. // },
  742. mounted() {
  743. this.getList();
  744. this.initFormSubData();
  745. },
  746. methods: {
  747. // 自定义字段校验
  748. checkBtnFormKey(rule, value, callback) {
  749. let { btnType } = this.btnGroupFormData;
  750. console.log(btnType);
  751. if (btnType == "INSERT" || btnType == "UPDATE") {
  752. if (!value) {
  753. callback(new Error("请绑定表单"));
  754. }
  755. }
  756. callback();
  757. },
  758. checkBtnProcessKey(rule, value, callback) {
  759. let { btnType } = this.btnGroupFormData;
  760. console.log(btnType);
  761. if (btnType == "EXECUTE" || btnType == "INITIATED") {
  762. if (!value) {
  763. callback(new Error("请绑定流程"));
  764. }
  765. }
  766. callback();
  767. },
  768. checkBtnScriptKey(rule, value, callback) {
  769. let { btnType } = this.btnGroupFormData;
  770. console.log(btnType);
  771. if (btnType == "EXECUTE") {
  772. if (!value) {
  773. callback(new Error("请绑定脚本"));
  774. }
  775. }
  776. callback();
  777. },
  778. // 删除公共传参
  779. deleteFilterItem(index) {
  780. this.commonFieldData.splice(index, 1);
  781. },
  782. // 删除query参数
  783. deleteQueryItem(index) {
  784. this.queryTableData.splice(index, index);
  785. },
  786. // 添加公共传参
  787. addFilterHandler() {
  788. if (this.rootFieldInfo.fieldList.length == 0) {
  789. this.$message.error("请先将按钮组绑定给表格");
  790. return;
  791. }
  792. this.commonFieldData.push({
  793. fieldName: "",
  794. fieldValue: "",
  795. });
  796. },
  797. // 获取根节点绑定表格的字段数据
  798. async getRootFieldInfo(btnKey) {
  799. let res = await checkBtn({ btnKey });
  800. if (res.code == 200) {
  801. if (res.rows[0]?.tableKey) {
  802. let tableInfo = await dragTableInfo({
  803. queryMap: { tableKey: res.rows[0].tableKey },
  804. });
  805. this.rootFieldInfo.fieldList = this.columnsHandler(
  806. JSON.parse(tableInfo.data.resultMap.template.dtColumnName)
  807. );
  808. }
  809. }
  810. },
  811. // 处理列表信息
  812. columnsHandler(columns) {
  813. let resArr = [];
  814. columns.forEach((item) => {
  815. for (const key in item) {
  816. let tempObj = {};
  817. tempObj.key = camelCase(key);
  818. tempObj.value = item[key];
  819. resArr.push(tempObj);
  820. }
  821. });
  822. return resArr;
  823. },
  824. // 给所有节点设置根节点key
  825. setRootBtnKey(rows, rootKey = "") {
  826. if (rows.length == 0) {
  827. return rows;
  828. }
  829. for (let i = 0; i < rows.length; i++) {
  830. let row = rows[i];
  831. if (row.btnParentId == 0) {
  832. row.rootKey = row.btnKey;
  833. } else {
  834. row.rootKey = rootKey;
  835. }
  836. if (row.children.length != 0) {
  837. row.children = this.setRootBtnKey(row.children, row.rootKey);
  838. }
  839. }
  840. return rows;
  841. },
  842. // 选择图标
  843. selected(name) {
  844. this.btnGroupFormData.btnIcon = name;
  845. },
  846. /** 查询菜单列表 */
  847. getList() {
  848. this.loading = true;
  849. listBtn(this.queryParams).then((response) => {
  850. let res = this.setRootBtnKey(response.rows);
  851. this.btnList = res;
  852. this.loading = false;
  853. });
  854. },
  855. /** 转换菜单数据结构 */
  856. normalizer(node) {
  857. // if (node.children && !node.children.length) {
  858. // delete node.children;
  859. // }
  860. return {
  861. id: node.id,
  862. label: node.btnName,
  863. children: node.children,
  864. };
  865. },
  866. /** 查询菜单下拉树结构 */
  867. getTreeselect() {
  868. listBtn({ ...this.queryParams, isEnablePaging: false }).then(
  869. (response) => {
  870. this.menuOptions = [];
  871. const btnTemp = {
  872. id: 0,
  873. btnGroupName: "新建按钮组",
  874. btnName: "新建按钮组",
  875. children: [],
  876. btnType: "DIRECTORY",
  877. };
  878. let _this = this;
  879. let res = response.rows.filter((node) => _this.getAllMenuList(node));
  880. btnTemp.children.push(...res);
  881. this.menuOptions.push(btnTemp);
  882. }
  883. );
  884. },
  885. // 只保留目录
  886. getAllMenuList(node) {
  887. // 如果当前节点的btnType等于6,则保留该节点,否则删除该节点
  888. if (node.btnType == "DIRECTORY") {
  889. if (Array.isArray(node.children) && node.children.length != 0) {
  890. // 递归遍历子节点,并删除所有btnType不等于6的子节点
  891. let _this = this;
  892. node.children = node.children.filter((child) =>
  893. _this.getAllMenuList(child)
  894. );
  895. }
  896. return node;
  897. } else {
  898. return false;
  899. }
  900. },
  901. // 取消按钮
  902. cancel() {
  903. this.open = false;
  904. this.reset();
  905. },
  906. // 表单重置
  907. reset() {
  908. this.btnGroupFormData = {
  909. btnGroupName: "", //按钮组名
  910. btnParentId: "", //父节点id
  911. btnName: "", //按钮显示的文字
  912. btnIcon: "", //按钮图标
  913. btnType: "DIRECTORY", //0:操作按钮,1,其他,2表单,3跳转,4流程,5脚本
  914. btnFormKey: null, //表单唯一标识
  915. btnProcessKey: "", //流程唯一标识
  916. btnTableKey: "", //表格唯一标识
  917. btnScriptKey: "", //脚本唯一标识
  918. btnShowCondition: "", //按钮显示条件
  919. btnParams: "", //操作参数
  920. btnHasPermi: "", //权限字符
  921. btnSort: 0, //按钮顺序
  922. btnKey: "",
  923. };
  924. this.commonFieldData = [];
  925. this.resetForm("btnGroupFormRef");
  926. },
  927. /** 搜索按钮操作 */
  928. handleQuery() {
  929. this.getList();
  930. },
  931. /** 重置按钮操作 */
  932. resetQuery() {
  933. this.resetForm("queryForm");
  934. this.handleQuery();
  935. },
  936. /** 新增按钮操作 */
  937. async handleAdd(row) {
  938. this.reset();
  939. this.getTreeselect();
  940. this.editType = row ? true : false;
  941. if (row != null && row.id) {
  942. //在已知节点下新增
  943. await this.getRootFieldInfo(row.rootKey);
  944. this.btnGroupFormData.btnParentId = row.id;
  945. this.title = "新增按钮";
  946. } else {
  947. this.btnGroupFormData.btnParentId = 0;
  948. this.title = "添加按钮组";
  949. }
  950. this.open = true;
  951. },
  952. /** 展开/折叠操作 */
  953. toggleExpandAll() {
  954. this.refreshTable = false;
  955. this.isExpandAll = !this.isExpandAll;
  956. this.$nextTick(() => {
  957. this.refreshTable = true;
  958. });
  959. },
  960. /** 修改按钮操作 */
  961. async handleUpdate(row) {
  962. this.reset();
  963. this.getTreeselect();
  964. this.editType = false;
  965. //在已知节点下新增
  966. await this.getRootFieldInfo(row.rootKey);
  967. getBtn(row.id).then((response) => {
  968. let { btnType, btnParams } = response.data;
  969. if ((btnType == 3 || btnType == 7) && btnParams) {
  970. //内链或外链
  971. let tempObj = JSON.parse(btnParams);
  972. response.data.btnParams = tempObj.url;
  973. this.commonFieldData = JSON.parse(tempObj.commonFieldData) || [];
  974. } else {
  975. btnParams && (this.commonFieldData = JSON.parse(btnParams) || []);
  976. }
  977. this.btnGroupFormData = response.data;
  978. this.open = true;
  979. this.title = "修改按钮";
  980. });
  981. },
  982. // 校验复杂逻辑表单数据
  983. myValidate(formData) {
  984. // 校验按钮名和按钮必须填一个
  985. let res = {};
  986. res.flag = true;
  987. let nameOrIcon = !!formData.btnName || !!formData.btnIcon;
  988. if (!nameOrIcon) {
  989. res.flag = false;
  990. res.msg = "按钮名称和图标,至少需要有一个!";
  991. return res;
  992. }
  993. return res;
  994. },
  995. // 获取公共数据
  996. // getCommonData(list) {
  997. // if (list.length == 0) return '';
  998. // },
  999. /** 提交按钮 */
  1000. submitForm() {
  1001. this.$refs["btnGroupFormRef"].validate(async (valid) => {
  1002. console.log(this.btnGroupFormData);
  1003. console.log(valid);
  1004. if (valid) {
  1005. let validateRes = this.myValidate(this.btnGroupFormData);
  1006. if (!validateRes.flag) {
  1007. this.$message.error(validateRes.msg);
  1008. return;
  1009. }
  1010. // 获取公共参数
  1011. // let commonData=this.getCommonData(this.commonFieldData)
  1012. if (
  1013. this.btnGroupFormData.btnType != 3 &&
  1014. this.btnGroupFormData.btnType != 7
  1015. ) {
  1016. this.btnGroupFormData.btnParams = JSON.stringify(
  1017. this.commonFieldData
  1018. );
  1019. } else {
  1020. let tempObj = {};
  1021. tempObj.url = this.btnGroupFormData.btnParams;
  1022. tempObj.commonFieldData = JSON.stringify(this.commonFieldData);
  1023. this.btnGroupFormData.btnParams = JSON.stringify(tempObj);
  1024. }
  1025. if (this.editType) {
  1026. // 新增按钮组
  1027. this.btnGroupFormData.btnKey = uuidv4();
  1028. let res = await addBtn(this.btnGroupFormData);
  1029. if (res.code == 200) {
  1030. this.$message.success("添加成功");
  1031. } else {
  1032. this.$message.error("网络异常,请稍后添加");
  1033. }
  1034. } else {
  1035. // 修改按钮组
  1036. let res = await updateBtn(this.btnGroupFormData);
  1037. if (res.code == 200) {
  1038. this.$message.success("修改成功");
  1039. } else {
  1040. this.$message.error("网络异常,请稍后修改");
  1041. }
  1042. }
  1043. this.getList();
  1044. this.open = false;
  1045. }
  1046. });
  1047. },
  1048. // 更新路由
  1049. reloadRouter() {
  1050. this.$store.dispatch("GenerateRoutes").then((accessRoutes) => {
  1051. this.$router.addRoutes(accessRoutes); // 动态添加可访问路由表
  1052. });
  1053. },
  1054. /** 删除按钮操作 */
  1055. handleDelete(row) {
  1056. this.$modal
  1057. .confirm('是否确认删除名称为"' + row.btnGroupName + '"的数据项?')
  1058. .then(function () {
  1059. return delBtn(row.id);
  1060. })
  1061. .then(() => {
  1062. this.getList();
  1063. this.$modal.msgSuccess("删除成功");
  1064. })
  1065. .catch(() => {});
  1066. },
  1067. // 初始化表单辅助数据
  1068. async initFormSubData() {
  1069. try {
  1070. //获取表单选项数据
  1071. let formRes = await listForm({ isEnablePaging: false });
  1072. if (formRes.code == 200) {
  1073. formRes.rows.forEach((item) => {
  1074. item.fId = item.fId.toString();
  1075. });
  1076. this.formOptions = formRes.rows;
  1077. } else {
  1078. this.$message.error("网络异常请稍后再试");
  1079. }
  1080. // 获取流程选项数据
  1081. let processRes = await listProcess({ isEnablePaging: false });
  1082. if (processRes.code == 200) {
  1083. this.processOptions = [
  1084. ...processRes.rows,
  1085. {
  1086. processKey: "unknown",
  1087. processName: "未知流程",
  1088. },
  1089. ];
  1090. } else {
  1091. this.$message.error("网络异常请稍后再试");
  1092. }
  1093. // 获取表格选项数据
  1094. let TableRes = await listTable({ isEnablePaging: false });
  1095. if (TableRes.code == 200) {
  1096. this.tableOptions = TableRes.rows;
  1097. } else {
  1098. this.$message.error("网络异常请稍后再试");
  1099. }
  1100. // 获取脚本选项数据
  1101. let scriptRes = await listScript({ isEnablePaging: false });
  1102. if (scriptRes.code == 200) {
  1103. this.scriptOptions = scriptRes.rows;
  1104. } else {
  1105. this.$message.error("网络异常请稍后再试");
  1106. }
  1107. } catch (error) {
  1108. console.log(error);
  1109. }
  1110. },
  1111. // 添加按钮条件
  1112. addConditionHandler() {
  1113. this.conditionBtnData.push({
  1114. tableName: "",
  1115. fieldName: "",
  1116. condition: 1, //1:> 2:< 3:= 4:>= 5:<=
  1117. flagValue: 0,
  1118. fieldList: [],
  1119. });
  1120. },
  1121. },
  1122. };
  1123. </script>
  1124. <style scoped lang="scss" scoped>
  1125. /* #app .sidebar-container .submenu-title-noDropdown:hover, #app .sidebar-container .el-submenu__title:hover {
  1126. background-color: rgba(0, 0, 0, 0.06) !important;
  1127. } */
  1128. .submenu-title-noDropdown:hover {
  1129. background-color: linear-gradient(to right, blue, rgb(69, 118, 225));
  1130. }
  1131. .filter-table-wrap {
  1132. display: flex;
  1133. flex-direction: column;
  1134. align-items: center;
  1135. }
  1136. .table-wrap {
  1137. width: 100%;
  1138. display: flex;
  1139. flex-direction: column;
  1140. align-items: center;
  1141. }
  1142. .title {
  1143. font-weight: 600;
  1144. }
  1145. </style>