pic1.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. <template>
  2. <div class="root">
  3. <div id="headPanel">
  4. <!-- <span class="logo">G6 入门教程 - 脑图</span> -->
  5. <i class="gb-toggle-btn" />
  6. </div>
  7. <div class="crumb-nav" v-if="activeMenu + 'TITLE'">
  8. <template v-for="(nav, index) in crumbNavs">
  9. {{ index > 0 ? '>' : '' }}
  10. <span :key="nav.id" class="nav-text" @click="changeNode(nav)">{{ nav.label }}</span>
  11. </template>
  12. </div>
  13. <div class="text-nav">
  14. <span>{{ chart.option.title.text }}</span>
  15. </div>
  16. <!-- canvas 挂载节点 -->
  17. <div id="graph" />
  18. <!-- 输入框 -->
  19. <input v-show="showInput" id="input-controller" ref="inputController" v-model="inputValue" :style="{
  20. top: `${input.y}px`,
  21. left: `${input.x}px`,
  22. }" type="text" @blur="inputBlur">
  23. <el-dialog title="文件预览" :visible.sync="dialogVisible" destroy-on-close width="90%" top="6vh" height="90%">
  24. <el-button size="small" type="primary" icon="el-icon-download" v-privilege="activeMenu + 'DOWNLOAD'"
  25. @click="downloadFile(chart.fileData)" :loading="loading" style="position: absolute; right: 100px; top: 20px;">
  26. 点击保存
  27. </el-button>
  28. <iframe :src="previewUrl" width="100%" :height="singleTableHeight"></iframe>
  29. </el-dialog>
  30. </div>
  31. </template>
  32. <script>
  33. import G6 from 'G6-4.3.11';
  34. import registerEdge from './register-edge';
  35. import registerNode from './register-node';
  36. import formulaEditor from '~/components/zg/formulaEditor.vue';
  37. import {
  38. zCheckNumber1
  39. } from '~/utils/validator.js';
  40. import {
  41. formatDate
  42. } from '@/utils/util.js';
  43. import store from '@/store/index.js';
  44. export default {
  45. name: 'root',
  46. data() {
  47. return {
  48. multipleSelection: [],
  49. tableFormDataObj: {},
  50. form: {
  51. imgSavePath: '',
  52. },
  53. filterForm: {
  54. show: true,
  55. data: {
  56. uploadFileid: '',
  57. securityTypeid: '',
  58. securityTag: '',
  59. isprimary: '',
  60. version: formatDate(new Date(), 'yyyyMM00'),
  61. fileName: '',
  62. pattern: 'table'
  63. },
  64. rules: {},
  65. file: ''
  66. },
  67. listTopicTree: {
  68. show: true,
  69. loading: false,
  70. data: [],
  71. defaultProps: {
  72. children: 'children',
  73. label: 'securityName'
  74. }
  75. },
  76. pageNum: 1,
  77. pageSize: 20,
  78. total: 0,
  79. singleTableHeight: '720px',
  80. tableData: [],
  81. nameObj: {
  82. uploadFile: {
  83. obj: {},
  84. arr: []
  85. },
  86. securityType: {
  87. obj: {},
  88. arr: []
  89. },
  90. unitid: {
  91. obj: {},
  92. arr: []
  93. },
  94. roleList: {
  95. obj: {},
  96. arr: []
  97. }, // 角色信息
  98. securityTag: {
  99. obj: {},
  100. arr: []
  101. },
  102. pattern: {
  103. obj: {
  104. 'graphical': '图例',
  105. 'table': '表格'
  106. },
  107. arr: [{
  108. id: 'graphical',
  109. name: '图例'
  110. },
  111. {
  112. id: 'table',
  113. name: '表格'
  114. }
  115. ]
  116. }
  117. },
  118. loading: false,
  119. tableLoading: false,
  120. dialog: {
  121. editorBox: {
  122. show: false,
  123. fileType: '',
  124. form: {
  125. default: {
  126. workprocid: ''
  127. },
  128. data: {
  129. itemid: '',
  130. productid: '',
  131. workprocid: '',
  132. isprimary: '0',
  133. unitid: '',
  134. seqno: '',
  135. code: '',
  136. fileType: ''
  137. },
  138. rules: {
  139. productid: [{
  140. required: true,
  141. message: '该项不能为空',
  142. trigger: 'change'
  143. }],
  144. workprocid: [{
  145. required: true,
  146. message: '该项不能为空',
  147. trigger: 'change'
  148. }],
  149. seqno: [{
  150. validator: zCheckNumber1,
  151. trigger: 'change'
  152. }]
  153. }
  154. }
  155. },
  156. equationEditing: {
  157. show: false,
  158. form: {
  159. data: {
  160. clock: '',
  161. code: ''
  162. }
  163. }
  164. }
  165. },
  166. store,
  167. userInfo: {}, // 用户信息
  168. qrRole: [],
  169. userRoles: [],
  170. dialogVisible: false,
  171. previewUrl: '',
  172. chart: {
  173. height: '1024px',
  174. show: false,
  175. fileData: {
  176. fileName: '',
  177. fileUrl: ''
  178. },
  179. option: {
  180. title: {
  181. text: '典型事故应急"四步"管控体系'
  182. },
  183. tooltip: {
  184. trigger: 'item',
  185. triggerOn: 'mousemove'
  186. },
  187. toolbox: {
  188. feature: {
  189. saveAsImage: {}
  190. }
  191. },
  192. series: [{
  193. type: 'tree',
  194. data: [],
  195. top: '2%',
  196. left: '25%',
  197. bottom: '1%',
  198. right: '20%',
  199. symbolSize: 8,
  200. nodePadding: 50,
  201. label: {
  202. position: 'left',
  203. verticalAlign: 'bottom',
  204. align: 'right',
  205. fontSize: 14
  206. },
  207. leaves: {
  208. label: {
  209. position: 'right',
  210. verticalAlign: 'middle',
  211. align: 'left'
  212. }
  213. },
  214. emphasis: {
  215. focus: 'descendant'
  216. },
  217. initialTreeDepth: 2,
  218. expandAndCollapse: true,
  219. animationDuration: 550,
  220. animationDurationUpdate: 750,
  221. roam: true
  222. }]
  223. }
  224. },
  225. graph: null,
  226. showInput: false,
  227. inputValue: '',
  228. activeMenu: '',
  229. input: {
  230. x: 0,
  231. y: 0,
  232. },
  233. currentNode: {
  234. id: null,
  235. },
  236. crumbNavs: [],
  237. };
  238. },
  239. created() {
  240. this.activeMenu = window.localStorage.getItem('activeMenu');
  241. },
  242. mounted() {
  243. let that = this;
  244. that.getFileTreeData();
  245. },
  246. beforeDestroy() {
  247. this.graph.destroy();
  248. },
  249. methods: {
  250. createGraphic() {
  251. const vm = this;
  252. registerEdge(G6);
  253. registerNode(G6);
  254. const menu = new G6.Menu({
  255. offsetY: -20,
  256. itemTypes: ['node'],
  257. getContent(e) {
  258. return `
  259. <p class="menu-item" command="edit-node">编辑文本</p>
  260. <p class="menu-item" command="delete-node">删除节点</p>
  261. `;
  262. },
  263. handleMenuClick(target, item) {
  264. const command = target.getAttribute('command');
  265. switch (command) {
  266. case 'edit-node':
  267. vm.editNode(item);
  268. break;
  269. case 'delete-node':
  270. vm.deleteNode(item);
  271. break;
  272. }
  273. },
  274. });
  275. const graph = new G6.TreeGraph({
  276. container: document.getElementById('graph'),
  277. width: window.innerWidth - 10,
  278. height: window.innerHeight - 10,
  279. defaultNode: {
  280. type: 'tree-node',
  281. style: {
  282. width: 100,
  283. height: 30,
  284. radius: 4,
  285. fill: '#ffffff00',
  286. stroke: '#999',
  287. },
  288. labelCfg: {
  289. style: {
  290. fontSize: 14,
  291. },
  292. },
  293. },
  294. defaultEdge: {
  295. type: 'right-tree',
  296. },
  297. layout: {
  298. type: 'mindmap',
  299. direction: 'H',
  300. getHeight: function getHeight() {
  301. return 16;
  302. },
  303. getWidth: function getWidth() {
  304. return 16;
  305. },
  306. getVGap: function getVGap() {
  307. return 20;
  308. },
  309. getHGap: function getHGap() {
  310. return 120;
  311. },
  312. },
  313. modes: {
  314. default: [
  315. 'drag-canvas',
  316. 'zoom-canvas',
  317. 'drag-node',
  318. // {
  319. // type: 'collapse-expand',
  320. // onChange(item, collapsed) {
  321. // const data = item.get('model');
  322. // data.collapsed = collapsed;
  323. // return true;
  324. // },
  325. // },
  326. ],
  327. },
  328. // plugins: [menu],
  329. fitView: true,
  330. fitViewPadding: 80,
  331. });
  332. // graph.data(vm.chart.option.series[0].data[0]);
  333. // gragh.render();
  334. graph.read({
  335. ...vm.chart.option.series[0].data[0]
  336. });
  337. graph.fitView(80);
  338. this.graph = graph;
  339. this.bindEvents();
  340. },
  341. /*
  342. * 1: 1
  343. * 1-1: 1 1-1
  344. * 1-1-1: 1 1-1 1-1-1
  345. * 1-1-1-1: 1 1-1 1-1-1 1-1-1-1
  346. */
  347. getParentNodes(node, id, deep = 1) {
  348. if (id.substring(0, 1) === '1' && deep === 1) {
  349. this.crumbNavs.push(node);
  350. }
  351. if (id.length > 1) {
  352. const $id = id.substring(0, deep * 2 + 1);
  353. const $node = node.children.find(item => item.id === $id);
  354. if ($node) {
  355. this.crumbNavs.push($node);
  356. if ($node.children && $node.children.length > 0) {
  357. this.getParentNodes($node, id, deep + 1);
  358. }
  359. }
  360. }
  361. },
  362. bindEvents() {
  363. this.graph.on('node:click', e => {
  364. const model = e.item.getModel();
  365. if (e.target.cfg.name === 'node-icon-text') {
  366. /* 展开按钮的事件 */
  367. model.collapsed = !model.collapsed;
  368. this.graph.updateItem(e.item, model);
  369. this.graph.layout();
  370. this.graph.fitView(80);;
  371. } else {
  372. if (model.value) {
  373. let args = {
  374. fileName: model.label,
  375. fileUrl: model.value
  376. } //当前节点及其子节点的值
  377. this.preview(args);
  378. } else {
  379. if(model.id.length === 1) {
  380. // this.chart.option.title.text = '安泰控股集团';
  381. } else {
  382. // this.chart.option.title.text = model.label;
  383. }
  384. /* 节点点击事件 */
  385. // 记录当前节点 id
  386. model.collapsed = false;
  387. this.currentNode.id = model.id;
  388. this.crumbNavs = [];
  389. // 查找所有的节点路径
  390. this.getParentNodes(this.chart.option.series[0].data[0], model.id);
  391. this.graph.changeData(JSON.parse(JSON.stringify(model)));
  392. this.graph.fitView(80);
  393. }
  394. }
  395. e.item.toFront();
  396. });
  397. },
  398. inputBlur() {
  399. this.showInput = false;
  400. const item = this.graph.findById(this.currentNode.id);
  401. const model = item.getModel();
  402. model.label = this.inputValue;
  403. this.graph.updateItem(item, model);
  404. },
  405. // 编辑节点
  406. editNode(item) {
  407. const model = item.getModel();
  408. const {
  409. cacheCanvasBBox
  410. } = item.get('group').cfg;
  411. this.showInput = true;
  412. this.inputValue = model.label;
  413. this.currentNode.id = model.id;
  414. this.input.x = cacheCanvasBBox.x;
  415. this.input.y = cacheCanvasBBox.y;
  416. this.$nextTick(() => {
  417. this.$refs.inputController.focus();
  418. });
  419. },
  420. deleteNode(item) {
  421. const id = item.get('id');
  422. if (id.length > 1) {
  423. const parentId = id.substring(0, id.length - 2);
  424. const parent = this.graph.findById(parentId);
  425. parent.toFront();
  426. }
  427. this.graph.removeChild(id);
  428. if (id.length > 1) {
  429. const parentId = id.substring(0, id.length - 2);
  430. const parent = this.graph.findById(parentId);
  431. const model = parent.get('model');
  432. if (model.children.length === 0) {
  433. const group = parent.get('group');
  434. const {
  435. children
  436. } = group.cfg;
  437. const icon = children.find(child => child.name === 'node-icon');
  438. const iconText = children.find(child => child.name === 'node-icon-text');
  439. if (icon) {
  440. icon.remove();
  441. iconText.remove();
  442. }
  443. }
  444. }
  445. },
  446. changeNode(node) {
  447. if(node.id.length === 1) {
  448. // this.chart.option.title.text = '安泰控股集团';
  449. } else {
  450. // this.chart.option.title.text = node.label;
  451. }
  452. this.graph.changeData(JSON.parse(JSON.stringify(node)));
  453. this.graph.fitView(80);;
  454. },
  455. getFileTreeData() {
  456. let that = this,
  457. params = {
  458. fileName: that.filterForm.data.fileName,
  459. type: that.filterForm.data.securityTypeid,
  460. fileType: that.filterForm.data.securityTag.toString()
  461. };
  462. that.tableLoading = true;
  463. let url = 'pass/ems/v1/uploadfiles/getFileTree/?securityInfo=' + that.qrRole;
  464. that.axios.get(url, {
  465. params: params
  466. })
  467. .then(function(res) {
  468. if (res.code === '0') {
  469. let arr = [];
  470. // that.chart.height = res.data.length * 100 + 'px';
  471. arr = that.treeDataUtil(res.data, '');
  472. // arr = that.getParentNodes(res.data, 1)
  473. arr[0].labelCfg = {
  474. style: {
  475. fontSize: 30,
  476. },
  477. };
  478. arr[0].id = '1';
  479. arr[0].collapsed = false,
  480. that.chart.option.series[0].data = arr;
  481. // that.setGraphical();
  482. that.createGraphic();
  483. } else {
  484. that.$message.error(res.message);
  485. }
  486. that.tableLoading = false;
  487. }).catch(function() {
  488. that.tableLoading = false;
  489. });
  490. },
  491. treeDataUtil(treeData, id) {
  492. let that = this;
  493. let data = [];
  494. let children = [];
  495. let children1 = [];
  496. let i = 0;
  497. let k = 0;
  498. let j = 0;
  499. let g = 0;
  500. let name = '';
  501. for (let item of treeData) {
  502. i++;
  503. if (item.fileName === null) {
  504. g++;
  505. if (item.children !== null) {
  506. if (id == '') {
  507. children = that.treeDataUtil(item.children, i);
  508. } else {
  509. children = that.treeDataUtil(item.children, id + '-' + g);
  510. }
  511. };
  512. data.push({
  513. collapsed: true,
  514. id: id + '-' + g,
  515. nodeType: 'node',
  516. label: item.createMan,
  517. children: children,
  518. });
  519. children = [];
  520. } else {
  521. if (name === '' || i === 1) {
  522. name = item.createMan;
  523. } else if (name !== item.createMan) {
  524. g++;
  525. for (let ch of children1) {
  526. ch.id = id + '-' + g + ch.id.substring(ch.id.lastIndexOf("-"))
  527. }
  528. data.push({
  529. collapsed: true,
  530. id: id + '-' + g,
  531. nodeType: 'node',
  532. isCollapsed: true,
  533. label: name,
  534. children: children1,
  535. });
  536. j = 0;
  537. children1 = [];
  538. name = item.createMan;
  539. }
  540. j++;
  541. children1.push({
  542. id: id + '-' + g + '-' + j,
  543. label: item.fileName,
  544. value: item.fileUrl,
  545. children: [],
  546. });
  547. }
  548. if (i === treeData.length && children1.length !== 0) {
  549. g++;
  550. for (let ch of children1) {
  551. ch.id = id + '-' + g + ch.id.substring(ch.id.lastIndexOf("-"))
  552. }
  553. data.push({
  554. collapsed: true,
  555. id: id + '-' + g,
  556. nodeType: 'node',
  557. isCollapsed: true,
  558. label: name,
  559. children: children1,
  560. });
  561. }
  562. }
  563. return data;
  564. },
  565. downloadFile(data) {
  566. let that = this;
  567. let SubmitData = {
  568. fileName: data.fileName,
  569. fileUrl: data.fileUrl
  570. };
  571. // 不带token访问方式,留底后端修改shiroconfig.java,application.properties
  572. // let url = '/zhongsteel.pass.web/pass/ems/v1/uploadfiles/downloadFile/?fileName=' + that.tableFormDataObj[key].fileName + '&fileUrl=' + that.tableFormDataObj[key].fileUrl;
  573. // const xhr = new XMLHttpRequest();
  574. // xhr.open('GET', url, true);
  575. // xhr.responseType = 'blob';
  576. // xhr.onload = () => {
  577. // if (xhr.status === 200) {
  578. // var fileName = that.tableFormDataObj[key].fileName;
  579. // // 获取文件blob数据并保存
  580. // that.saveAs(xhr.response, fileName);
  581. // }
  582. // };
  583. // xhr.send();
  584. that.loading = true;
  585. let urla = 'pass/ems/v1/uploadfiles/downloadFile/';
  586. that.axios.get(urla, {
  587. params: SubmitData,
  588. responseType: 'blob'
  589. }).then(function(res) {
  590. that.saveAs(res, data.fileName);
  591. that.$message({
  592. message: '下载成功',
  593. type: 'success'
  594. });
  595. that.loading = false;
  596. }).catch(function() {
  597. that.$message.error('下载失败');
  598. that.loading = false;
  599. })
  600. },
  601. // js实现文件下载而不直接打开
  602. saveAs(data, fileName) {
  603. this.loading = true;
  604. let urlObject = window.URL || window.webkitURL || window;
  605. // 将二进制流转为blob
  606. let exportBlob = new Blob([data]);
  607. if (typeof window.navigator.msSaveBlob !== 'undefined') {
  608. // 兼容IE,window.navigator.msSaveBlob:以本地方式保存文件
  609. window.navigator.msSaveBlob(exportBlob, decodeURI(fileName));
  610. this.loading = false;
  611. } else {
  612. // 创建新的URL并指向File对象或者Blob对象的地址
  613. let blobURL = urlObject.createObjectURL(exportBlob);
  614. let saveLink = document.createElement('a');
  615. // 兼容:某些浏览器不支持HTML5的download属性
  616. if (typeof saveLink.download === 'undefined') {
  617. saveLink.setAttribute('target', '_blank');
  618. } else {
  619. saveLink.download = fileName;
  620. }
  621. // 创建新的URL并指向File对象或者Blob对象的地址
  622. saveLink.href = blobURL;
  623. saveLink.click();
  624. // 释放blob URL地址
  625. urlObject.revokeObjectURL(exportBlob);
  626. this.loading = false;
  627. // let blob = new Blob([data])
  628. // let fileURL = urlObject.createObjectURL(blob);
  629. // 下载代码
  630. // let downEle = document.createElement('a')
  631. // let fname = `download` //下载文件的名字
  632. // downEle.href = fileURL
  633. // downEle.setAttribute('download', fname)
  634. // document.body.appendChild(downEle)
  635. // downEle.click()
  636. // window.open(fileURL);
  637. }
  638. },
  639. preview(data) {
  640. let that = this;
  641. that.loading = true;
  642. that.chart.fileData = data;
  643. let SubmitData = {
  644. fileName: data.fileName,
  645. fileUrl: data.fileUrl
  646. };
  647. let urla = 'pass/ems/v1/uploadfiles/getfile/';
  648. let type = 'text/html';
  649. let responseType = 'application/json';
  650. let fileExtension = data.fileName.substring(data.fileName.lastIndexOf('.') + 1);
  651. if (fileExtension === 'pdf') {
  652. urla = 'pass/ems/v1/uploadfiles/downloadFile/';
  653. type = 'application/pdf';
  654. responseType = 'blob';
  655. }
  656. that.tableLoading = true;
  657. that.axios.get(urla, {
  658. params: SubmitData,
  659. responseType: responseType
  660. }).then(function(res) {
  661. console.log('111');
  662. let urlObject = window.URL || window.webkitURL || window;
  663. // 将二进制流转为blob
  664. let blob = new Blob([res], {
  665. type: type
  666. });
  667. if (fileExtension !== 'pdf') {
  668. blob = new Blob([res.data], {
  669. type: type
  670. });
  671. }
  672. // if (typeof window.navigator.msSaveBlob !== 'undefined') {
  673. // // 兼容IE,window.navigator.msSaveBlob:以本地方式保存文件
  674. // window.navigator.msSaveBlob(blob, decodeURI(fileName))
  675. // } else {
  676. // 创建新的URL并指向File对象或者Blob对象的地址
  677. let blobURL = urlObject.createObjectURL(blob);
  678. that.dialogVisible = true;
  679. that.previewUrl = blobURL;
  680. that.tableLoading = false;
  681. that.loading = false;
  682. // 'https://file.keking.cn/onlinePreview?url=' + encodeURIComponent(blobURL)
  683. // http://view.officeapps.live.com/op/view.aspx?src' + blobURL;
  684. // 创建a标签,用于跳转至下载链接
  685. // let tempLink = document.createElement('a')
  686. // tempLink.style.display = 'none'
  687. // tempLink.href = blobURL;
  688. // tempLink.setAttribute('download', decodeURI(fileName))
  689. // 兼容:某些浏览器不支持HTML5的download属性
  690. // if (typeof tempLink.download === 'undefined') {
  691. // tempLink.setAttribute('target', '_blank')
  692. // }
  693. // // 挂载a标签
  694. // document.body.appendChild(tempLink)
  695. // tempLink.click()
  696. // // 销毁a标签
  697. // document.body.removeChild(tempLink)
  698. // 释放blob URL地址
  699. // urlObject.revokeObjectURL(blobURL);
  700. setTimeout(() => {
  701. urlObject.revokeObjectURL(blobURL);
  702. }, 1000)
  703. }).catch(function() {
  704. that.tableLoading = false;
  705. that.$message.error('预览失败');
  706. that.loading = false;
  707. })
  708. },
  709. },
  710. };
  711. </script>
  712. <style lang="scss">
  713. .root {
  714. background: url(../../../../assets/img/img/filebg.png) center bottom no-repeat;
  715. background-size: 100% 100%;
  716. }
  717. .crumb-nav {
  718. position: absolute;
  719. top: 20px;
  720. left: 40px;
  721. background: #73bf8f;
  722. border-radius: 4px;
  723. color: #fff;
  724. }
  725. .nav-text {
  726. display: inline-block;
  727. height: 36px;
  728. line-height: 36px;
  729. margin: 0 10px;
  730. cursor: pointer;
  731. }
  732. .g6-component-contextmenu {
  733. width: 100px;
  734. padding: 6px 0;
  735. cursor: pointer;
  736. .menu-item {
  737. padding: 0 10px;
  738. line-height: 26px;
  739. &:hover {
  740. background: #f0f0f0;
  741. }
  742. }
  743. }
  744. #input-controller {
  745. position: absolute;
  746. top: 0;
  747. left: 0;
  748. z-index: 12;
  749. width: 100px;
  750. height: 30px;
  751. border: 1px solid #ccc;
  752. border-radius: 4px;
  753. padding-left: 6px;
  754. font-size: 14px;
  755. }
  756. .text-nav {
  757. position: absolute;
  758. top: 20px;
  759. left: 36%;
  760. font-size: 40px;
  761. // background: #73bf8f;
  762. // border-radius: 4px;
  763. color: #000000;
  764. }
  765. </style>