index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. <template>
  2. <div>
  3. <!-- <el-button type="primary" @click="showData">测试</el-button> -->
  4. <div style="display: flex;margin-left: 1%;padding-top: 1%;position: absolute;z-index: 1000;cursor: pointer;justify-content: space-between;width: 98%;" @click="back">
  5. <el-icon size="large"><Back /></el-icon>
  6. <el-button style="margin-left: auto;" type="danger" size="mini">删除</el-button>
  7. <el-button style="margin-left: 1%;" type="primary" size="mini">保存</el-button>
  8. </div>
  9. <div v-if="nodeDeSer" style="height: 85vh;width: 20vw;position: absolute;float: right;z-index: 1000;right: 1%;top: 1%;border: 0.1px solid #dedfe0;border-radius: 6px;background-color: white;">
  10. <div style="display: flex;margin-left: 3%;margin-top: 3%;align-items: center;justify-content: space-between;width: 95%;">
  11. <el-tag class="ml-2" style="" type="warning">服务</el-tag>
  12. <div style="margin-left: 4%;">
  13. {{servieName}}
  14. </div>
  15. <el-icon @click="nodeDeSer = false" style="margin-left: auto;cursor: pointer;"><Close /></el-icon>
  16. </div>
  17. <div>
  18. <div style="display: flex;width: 90%;margin-left: 5%;margin-top:10%;align-items: center;justify-content: space-between;">
  19. <el-input v-model="serviceUrl" style="width: 90%;" placeholder="Please input" disabled>
  20. <template #prepend>
  21. <div v-if="serviceRqtype==='GET'" style="color: #67C23A;background-color: transparent;">
  22. GET
  23. </div>
  24. <div v-if="serviceRqtype==='POST'" style="color: #409EFF;background-color: transparent;">
  25. POST
  26. </div>
  27. </template>
  28. </el-input>
  29. <svg-icon icon-class="startTest" style="margin-left: auto;width: 50px;height: 25px;cursor: pointer;"/>
  30. </div>
  31. <div style="display: flex;width: 90%;margin-left: 5%;margin-top:10%;align-items: center;justify-content: space-between;">
  32. <el-table :data="tableDataCan" border style="width: 100%">
  33. <el-table-column prop="paramCode" label="参数名" width="" />
  34. <el-table-column prop="paramValue" label="参数值" width="">
  35. <template #default="scope">
  36. <div style="width: 100%;">
  37. <el-input placeholder="" type="primary" class="noBor" v-model="scope.row.paramValue" size="mini" text style="margin-left: 0%;"></el-input>
  38. </div>
  39. </template>
  40. </el-table-column>
  41. </el-table>
  42. </div>
  43. <div style="display: flex;width: 90%;margin-left: 5%;margin-top:10%;align-items: center;justify-content: space-between;">
  44. <el-form ref="deptRef" :model="form" :rules="rules" label-width="80px" label-position="top">
  45. <el-form-item label="BODY">
  46. <!-- 单选 -->
  47. <el-radio-group v-model="form.bodyType">
  48. <el-radio value="none">none</el-radio>
  49. <el-radio value="form-data">form-data</el-radio>
  50. <el-radio value="x-www-form-urlencoded">x-www-form-urlencoded</el-radio>
  51. <el-radio value="JSON">JSON</el-radio>
  52. <el-radio value="raw">raw</el-radio>
  53. </el-radio-group>
  54. </el-form-item>
  55. <el-form-item label="失败处理">
  56. <el-select v-model="form.errorPolicy" style="width: 50%">
  57. <el-option label="报错" value="ABORT"></el-option>
  58. <el-option label="忽视" value="IGNORE"></el-option>
  59. <el-option label="重连" value="RETRY"></el-option>
  60. </el-select>
  61. </el-form-item>
  62. <el-form-item label="失败重连次数">
  63. <el-input-number v-model="form.retryCount" :min="1" style="width: 50%" :max="30"/>
  64. </el-form-item>
  65. </el-form>
  66. </div>
  67. </div>
  68. </div>
  69. <div style="display: flex;height: 85vh;width: 100%;padding-top:2%;">
  70. <div style="width: 20%;margin-left: 1%;overflow-y: auto;">
  71. <el-tree :expand-on-click-node="false" ref="treeRef" :filter-node-method="filterNode" :current-node-key="currentNodeKey" class="treeLeft" :data="dataTree" @node-click="handleNodeClick" node-key="id" style="margin-left: 5%;margin-top: 5%;width: 90%;background-color: transparent;" default-expand-all :key="valueKet">
  72. <template #default="{ node, data }">
  73. <span style="justify-content: space-between;display: flex;width: 100%;align-items: center;">
  74. <div class="custom-tree-node":draggable="true"
  75. @dragstart="onDragStart($event,data)">
  76. <!-- <el-tag v-if="data.nodeType=='MODEL'" class="ml-2" type="warning">模型</el-tag> -->
  77. <svg-icon icon-class="model2" style="color: #eebe77;" v-if="data.nodeType=='MODEL'"/>
  78. <!-- <el-tag class="ml-2">
  79. 服务
  80. </el-tag> -->
  81. <svg-icon icon-class="model" dstyle="color: #13E03B;" v-if="data.nodeType=='SERVICE'"/>
  82. <svg-icon svg-icon icon-class="cate" style="color: red;" v-if="data.nodeType=='TREE'"/>
  83. <span>{{ node.label }}</span>
  84. </div>
  85. </span>
  86. </template>
  87. </el-tree>
  88. </div>
  89. <VueFlow :nodes="nodes" :edges="edges" @drop="onDrop" @dragover="onDragOver" @dragleave="onDragLeave"
  90. @node-click="onNodeClick" @connect="onConnect" fit-view-on-init>
  91. <template #node-special="specialNodeProps">
  92. <div v-if="specialNodeProps.data.label=='开始'" class="vue-flow__node-default" style="border: 0.2px solid #c8c9cc;border-radius: 6px;min-height: 6vh;min-width: 11vw">
  93. <div style='width:100%;font-size:10px;display:flex;align-items:flex-end;height: 10px;margin-top: 2%;'>
  94. <img style="width: 15px;height:15px;border-radius: 12px;" src="@/assets/images/icon-Start-v2.jpg" alt="">
  95. <div style="margin-left: 3%;font-weight: 500;">
  96. 开始
  97. </div>
  98. <el-tag class="ml-2" style="width: 30px;height: 15px;font-size: 7px;margin-left: 6%;" type="info">触发器</el-tag>
  99. </div>
  100. <Handle type="source" :position="Position.Right"/>
  101. </div>
  102. <div v-if="specialNodeProps.data.label=='结束'" class="vue-flow__node-default" style="border: 0.2px solid #c8c9cc;border-radius: 6px;min-height: 6vh;min-width: 11vw">
  103. <div style='width:100%;font-size:10px;display:flex;align-items:flex-end;height: 10px;margin-top: 2%;'>
  104. <img style="width: 15px;height:15px;border-radius: 12px;" src="@/assets/images/icon-Start-v2.jpg" alt="">
  105. <div style="margin-left: 3%;font-weight: 500;">
  106. 结束
  107. </div>
  108. <div>
  109. </div>
  110. </div>
  111. <Handle type="target" :position="Position.Left"/>
  112. </div>
  113. <div v-if="specialNodeProps.data.label!=='结束'&&specialNodeProps.data.label!=='开始'" class="vue-flow__node-default"
  114. style="border: 0.5px solid #c8c9cc;border-radius: 6px;border-radius: 6px;min-height: 8vh;min-width: 13vw">
  115. <div style='width:100%;font-size:10px;display:flex;align-items:flex-end;height: 10px;margin-top: 2%;justify-content: space-between;'>
  116. <img style="width: 15px;height:15px;border-radius: 12px;" src="@/assets/images/icon-HTTP.png" alt="">
  117. <div style="margin-left:3%;font-weight: 500;">
  118. {{ specialNodeProps.data.label }}
  119. </div>
  120. <el-icon style="cursor: pointer;margin-left: auto;"><CaretRight /></el-icon>
  121. <el-icon style="cursor: pointer;color: #F56C6C;margin-left: 2%;"><Delete /></el-icon>
  122. </div>
  123. <div style="display: flex;margin-top: 3%;">
  124. <el-tag class="ml-2" style="width: 35px;height: 20px;font-size: 10px;" type="warning">服务</el-tag>
  125. </div>
  126. <div style="display: flex;margin-top: 3%;font-size: 9px;color: #b1b3b8;align-items: center;">
  127. <div>
  128. GET:
  129. </div>
  130. <div>
  131. https://www.zhihu.com/
  132. </div>
  133. </div>
  134. <div style="display: flex;margin-top: 3%;font-size: 9px;color: #b1b3b8;align-items: center;">
  135. <div>
  136. 输出:
  137. </div>
  138. <div>
  139. https://www.zhihu.com/
  140. </div>
  141. </div>
  142. <Handle type="source" :position="Position.Right"/>
  143. <Handle type="target" :position="Position.Left"/>
  144. </div>
  145. </template>
  146. <template #edge-custom="specialEdgeProps">
  147. <div style="height: 1px;color: red;">
  148. </div>
  149. </template>
  150. </VueFlow>
  151. </div>
  152. <!-- 添加或修改部门对话框 -->
  153. <el-dialog :title="title" v-model="open" width="600px" append-to-body>
  154. <template #header="{ close, titleId, titleClass }">
  155. <div style="display: flex;align-items: center;">
  156. <el-tag>{{ form.type }}</el-tag>
  157. <h4 style="margin: 0 0 0 5px;" :id="titleId" :class="titleClass">{{ form.label }}</h4>
  158. </div>
  159. </template>
  160. <el-form ref="deptRef" :model="form" :rules="rules" label-width="80px" label-position="top">
  161. <el-form-item label="API">
  162. <el-row style="width: 100%;" :gutter="20">
  163. <el-col :span="4">
  164. <el-select v-model="form.config.method" style="width: 100px">
  165. <el-option label="GET" value="GET"></el-option>
  166. <el-option label="POST" value="POST"></el-option>
  167. <el-option label="HEAD" value="HEAD"></el-option>
  168. <el-option label="PATCH" value="PATCH"></el-option>
  169. <el-option label="PUT" value="PUT"></el-option>
  170. <el-option label="DELETE" value="DELETE"></el-option>
  171. </el-select>
  172. </el-col>
  173. <el-col :span="20">
  174. <el-input v-model="form.config.url" placeholder="请输入URL"/>
  175. </el-col>
  176. </el-row>
  177. </el-form-item>
  178. <el-form-item label="HEADERS">
  179. <dynamic-map v-model="form.config.headers"></dynamic-map>
  180. </el-form-item>
  181. <el-form-item label="PARAMS">
  182. <dynamic-map v-model="form.config.params"></dynamic-map>
  183. </el-form-item>
  184. <el-form-item label="BODY">
  185. <!-- 单选 -->
  186. <el-radio-group v-model="form.bodyType">
  187. <el-radio value="none">none</el-radio>
  188. <el-radio value="form-data">form-data</el-radio>
  189. <el-radio value="x-www-form-urlencoded">x-www-form-urlencoded</el-radio>
  190. <el-radio value="JSON">JSON</el-radio>
  191. <el-radio value="raw">raw</el-radio>
  192. </el-radio-group>
  193. <dynamic-map v-if="form.bodyType === 'x-www-form-urlencoded'" v-model="form.config.body"></dynamic-map>
  194. </el-form-item>
  195. <el-row>
  196. <el-col :span="24">
  197. <el-form-item label="失败处理">
  198. <el-select v-model="form.errorPolicy" style="width: 100%">
  199. <el-option label="报错" value="ABORT"></el-option>
  200. <el-option label="忽视" value="IGNORE"></el-option>
  201. <el-option label="重连" value="RETRY"></el-option>
  202. </el-select>
  203. </el-form-item>
  204. </el-col>
  205. <el-col :span="24">
  206. <el-form-item v-if="form.errorPolicy === 'RETRY'" label="失败重连次数">
  207. <el-input-number v-model="form.retryCount" :min="1" :max="30"/>
  208. </el-form-item>
  209. </el-col>
  210. </el-row>
  211. </el-form>
  212. <template #footer>
  213. <div class="dialog-footer">
  214. <el-button type="primary" @click="submitForm">确 定</el-button>
  215. <el-button @click="cancel">取 消</el-button>
  216. </div>
  217. </template>
  218. </el-dialog>
  219. </div>
  220. </template>
  221. <script setup>
  222. import DynamicMap from '@/components/DynamicMap/index.vue'
  223. import {Promotion} from '@element-plus/icons-vue'
  224. import { onMounted, ref } from 'vue'
  225. import {useVueFlow, VueFlow ,MarkerType } from '@vue-flow/core'
  226. import SpecialNode from './components/SpecialNode.vue'
  227. import SpecialEdge from './components/SpecialEdge.vue'
  228. import {getPtServiceList,getSerDe} from "@/api/service/info.js";
  229. import {getModelList2} from "@/api/register/regCom.js";
  230. import {copyObject} from "@/utils/index.js";
  231. import {getWorkflowByModelId, saveWorkflow} from "@/api/standardization/workflow.js";
  232. import { useStore } from 'vuex';
  233. import {Handle, Position} from '@vue-flow/core'
  234. import { computed } from 'vue';
  235. import { modelTreeSelect } from "@/api/service/info";
  236. const {
  237. snapToGrid,
  238. addEdges,
  239. onEdgeClick,
  240. removeElements,
  241. addNodes,
  242. screenToFlowCoordinate,
  243. onNodesInitialized,
  244. updateNode,
  245. onNodeClick,
  246. getNodes,
  247. getEdges,
  248. removeNodes,
  249. removeEdges,
  250. } = useVueFlow()
  251. snapToGrid.value = true
  252. const servieName = ref()
  253. const serviceRqtype = ref()
  254. const serviceUrl = ref()
  255. const tableDataCan = ref()
  256. const nodeDeSer = ref(false)
  257. const {proxy} = getCurrentInstance();
  258. const modelQueryParams = ref({
  259. name: undefined,
  260. isPublic: '0',
  261. });
  262. const toolQueryParams = ref({
  263. name: undefined,
  264. });
  265. const dataTree = ref([]);
  266. const modelOptions = ref(undefined);
  267. const modelId = ref(undefined);
  268. const loading = ref(true);
  269. const toolType = ref('0');
  270. const serviceList = ref([]);
  271. const defaultEdgeStyle = {
  272. style: {
  273. stroke: '#6366f1',
  274. strokeWidth: 2,
  275. fill: 'none' // 避免截图时出现黑色背景 [4](@ref)
  276. },
  277. markerEnd: {
  278. type: MarkerType.ArrowClosed,
  279. color: '#ff0000', // 箭头颜色
  280. width: 15, // 箭头宽度
  281. height: 15 // 箭头高度
  282. }
  283. };
  284. const draggedData = ref(undefined);
  285. const isDragging = ref(false);
  286. const isDragOver = ref(false);
  287. const nodes = ref([
  288. { id: '1', position: { x: -600, y: -300 }, data: { label: '开始' }, type: 'special' },
  289. { id: '2', position: { x: 150, y: 100 }, data: { label: '结束' }, type: 'special' },
  290. ]);
  291. const edges = ref([]);
  292. const title = ref('')
  293. const open = ref(false)
  294. const store = useStore();
  295. onEdgeClick(({ edge }) => {
  296. edges.value = edges.value.filter(edge => edge.id !== edgeId)
  297. });
  298. async function getTreeLeft(){
  299. await modelTreeSelect().then(res=>{
  300. dataTree.value = res.data
  301. })
  302. optionsMdid.value = filterModelNodes(par)
  303. console.log(optionsMdid.value)
  304. }
  305. function showData(){
  306. console.log(nodes.value,edges.value)
  307. }
  308. function handleModelClick(mid) {
  309. modelId.value = mid
  310. removeNodes(getNodes.value)
  311. removeEdges(getEdges.value)
  312. getWorkflow(mid)
  313. }
  314. onNodeClick(({event, node}) => {
  315. console.log(node)
  316. if(node.data.nodeType==='SERVICE'){
  317. getSerDe(node.data.id).then(res=>{
  318. servieName.value = res.data.ptService.name
  319. tableDataCan.value = res.data.list
  320. serviceUrl.value = res.data.ptService.url
  321. dataReturn.value = res.data.returnList
  322. })
  323. nodeDeSer.value = true
  324. }
  325. });
  326. const data = reactive({
  327. form: {config: {}},
  328. queryParams: {
  329. pageNum: 1,
  330. pageSize: 10,
  331. userName: undefined,
  332. phonenumber: undefined,
  333. status: undefined,
  334. deptId: undefined
  335. },
  336. rules: {
  337. userName: [{required: true, message: "用户名称不能为空", trigger: "blur"}, {
  338. min: 2,
  339. max: 20,
  340. message: "用户名称长度必须介于 2 和 20 之间",
  341. trigger: "blur"
  342. }],
  343. nickName: [{required: true, message: "用户昵称不能为空", trigger: "blur"}],
  344. password: [{required: true, message: "用户密码不能为空", trigger: "blur"}, {
  345. min: 5,
  346. max: 20,
  347. message: "用户密码长度必须介于 5 和 20 之间",
  348. trigger: "blur"
  349. }, {pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur"}],
  350. email: [{type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"]}],
  351. phonenumber: [{pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}]
  352. }
  353. });
  354. const {queryParams, form, rules} = toRefs(data);
  355. const nodeId = ref(null)
  356. /**
  357. * 开始拖拽选项的事件
  358. * @param event
  359. * @param data
  360. */
  361. function onDragStart(event, data) {
  362. console.log(data)
  363. if (event.dataTransfer) {
  364. event.dataTransfer.setData('application/vueflow', data)
  365. event.dataTransfer.effectAllowed = 'move'
  366. }
  367. draggedData.value = data
  368. console.log(draggedData.value)
  369. isDragging.value = true
  370. document.addEventListener('drop', onDragEnd)
  371. }
  372. function back(){
  373. proxy.$router.push({ path: '/standardization/modelUsing' });
  374. }
  375. /**
  376. * 拖拽到画布vueflow的事件
  377. * @param event
  378. */
  379. function onDragOver(event) {
  380. event.preventDefault()
  381. if (draggedData.value) {
  382. isDragOver.value = true
  383. if (event.dataTransfer) {
  384. event.dataTransfer.dropEffect = 'move'
  385. }
  386. }
  387. }
  388. /**
  389. * 拖拽放下的事件
  390. * @param event
  391. */
  392. function onDrop(event) {
  393. const position = screenToFlowCoordinate({
  394. x: event.clientX,
  395. y: event.clientY,
  396. })
  397. const nodeId = Math.random() + "id";
  398. const data = copyObject(draggedData.value)
  399. const newNode = {
  400. id: nodeId,
  401. type: 'special',
  402. position,
  403. data,
  404. }
  405. // 更新位置到鼠标中心
  406. const {off} = onNodesInitialized(() => {
  407. updateNode(nodeId, (node) => ({
  408. position: {x: node.position.x - node.dimensions.width / 2, y: node.position.y - node.dimensions.height / 2},
  409. }))
  410. off()
  411. })
  412. addNodes(newNode)
  413. }
  414. /**
  415. * 拖拽到画布外面的的事件
  416. */
  417. function onDragLeave() {
  418. isDragOver.value = false
  419. }
  420. /**
  421. * 拖拽结束
  422. */
  423. function onDragEnd() {
  424. isDragging.value = false
  425. isDragOver.value = false
  426. draggedData.value = null
  427. document.removeEventListener('drop', onDragEnd)
  428. }
  429. function onConnect(params) {
  430. addEdges({ ...params, ...defaultEdgeStyle })
  431. }
  432. /** 查询模型列表 */
  433. function getModelList() {
  434. getModelList2(modelQueryParams.value).then(res => {
  435. loading.value = false;
  436. modelOptions.value = res.data;
  437. });
  438. }
  439. /** 通过条件过滤节点 */
  440. const filterNode = (value, data) => {
  441. if (!value) return true;
  442. return data.label.indexOf(value) !== -1;
  443. };
  444. /** 搜索按钮操作 */
  445. function handleQuery() {
  446. queryParams.value.pageNum = 1;
  447. getList();
  448. }
  449. /** 查询流程图 */
  450. function getList() {
  451. loading.value = true;
  452. // listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
  453. // loading.value = false;
  454. // userList.value = res.rows;
  455. // total.value = res.total;
  456. // });
  457. }
  458. /** 查询服务列表 */
  459. function getServiceList() {
  460. getPtServiceList(toolQueryParams.value).then(res => {
  461. serviceList.value = res.data.map(item => {
  462. return {
  463. id: item.id,
  464. label: item.name,
  465. type: 'API',
  466. config: {
  467. url: item.url,
  468. method: item.rqtype,
  469. params: item.params,
  470. headers: item.headers,
  471. body: item.body,
  472. },
  473. errorPolicy: 'ABORT',
  474. retryCount: 0,
  475. outputMapping: null,
  476. data: item,
  477. }
  478. })
  479. })
  480. }
  481. function submitForm() {
  482. updateNode(nodeId.value, (node) => ({
  483. data: form.value,
  484. }))
  485. cancel()
  486. }
  487. function cancel() {
  488. form.value = {config: {}};
  489. open.value = false;
  490. title.value = ''
  491. }
  492. function saveStep() {
  493. if (!modelId.value) {
  494. proxy.$modal.msgError("请选择模型");
  495. return
  496. }
  497. const nodes = getNodes.value.map(res => {
  498. return {
  499. id: res.id,
  500. type: res.type,
  501. position: res.position,
  502. data: res.data,
  503. }
  504. })
  505. const edges = getEdges.value.map(res => {
  506. return {
  507. source: res.source,
  508. target: res.target,
  509. }
  510. })
  511. const data = {
  512. mdid: modelId.value,
  513. graph: JSON.stringify({
  514. nodes: nodes,
  515. edges: edges,
  516. }),
  517. }
  518. saveWorkflow(data).then(res => {
  519. // 测试
  520. proxy.$modal.msgError("请输入建表语句");
  521. })
  522. }
  523. function getWorkflow(modelId) {
  524. getWorkflowByModelId(modelId).then(res => {
  525. if (res.data && res.data.graph) {
  526. const {nodes, edges} = JSON.parse(res.data.graph)
  527. addNodes(nodes)
  528. addEdges(edges)
  529. }
  530. })
  531. }
  532. onMounted(() => {
  533. getTreeLeft()
  534. getModelList()
  535. getServiceList()
  536. const count = computed(() => store.getters.id)
  537. console.log(count.value);
  538. })
  539. </script>
  540. <style>
  541. @import '@vue-flow/core/dist/style.css';
  542. @import '@vue-flow/core/dist/theme-default.css';
  543. </style>
  544. <style scoped>
  545. :deep(.treeLeft) .el-tree-node__content {
  546. display: flex !important;
  547. height: 28px; /* 按设计稿调整高度 */
  548. align-items: center;
  549. padding-top: 0 !important;
  550. }
  551. :deep(.treeLeft) .el-tree-node__content:hover {
  552. background-color: #e9e9eb;
  553. }
  554. :deep(.treeLeft) .el-tree-node__content:active {
  555. background-color: rgka(69,157,255,0.1) !important;
  556. }
  557. /* 选中态(Active) */
  558. :deep(.treeLeft) .el-tree-node.is-current > .el-tree-node__content {
  559. background-color: #c6e2ff !important;
  560. }
  561. </style>