index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. <template>
  2. <div class="ws-upload">
  3. <div v-if="!remarkWord">
  4. <el-button
  5. class="upload-btn"
  6. size="small"
  7. :disabled="disabled"
  8. type="primary"
  9. @click="_handleUploadClick"
  10. >{{ buttonName ? buttonName : $t('upload.uploadButton') }}</el-button
  11. >
  12. </div>
  13. <div class="trigger-group" v-if="editable && remarkWord">
  14. <el-button
  15. class="upload-btn"
  16. size="small"
  17. :disabled="disabled"
  18. type="primary"
  19. @click="_handleUploadClick"
  20. >{{ buttonName ? buttonName : $t('upload.uploadButton') }}</el-button
  21. >
  22. <div class="tip">
  23. {{ $t('upload.uploadText01') }}{{ formatTxt }}
  24. 格式的文件,单个文件大小不能超过10M
  25. </div>
  26. </div>
  27. <el-upload
  28. action="#"
  29. list-type="picture-card"
  30. :http-request="_handleRequest"
  31. :file-list="fileList"
  32. :before-upload="_handleBeforeUpload"
  33. :accept="accept"
  34. :multiple="!limit || parseInt(limit) > 1"
  35. ref="elUpload"
  36. >
  37. <template v-slot:trigger>
  38. <div ref="triggerDiv">-</div>
  39. </template>
  40. <template v-slot:file="{ file }">
  41. <div class="thumbnail-group">
  42. <winsea-picture-view
  43. v-if="isPictureFile(file)"
  44. class="el-upload-list__item-thumbnail"
  45. picturesShowType="fold"
  46. :pic-small-list="_getFileImg(file)"
  47. :pic-list="_getFileImgs"
  48. :width="110"
  49. :height="110"
  50. />
  51. <img
  52. v-else
  53. class="el-upload-list__item-thumbnail"
  54. :class="getFileClass(file)"
  55. />
  56. </div>
  57. <div class="fileName" v-if="showName" :title="file.name">
  58. {{ file.name }}
  59. </div>
  60. <span
  61. class="el-upload-list__item-actions"
  62. :class="!(file.status == 'success') ? 'operate-bg' : ''"
  63. v-if="file.status == 'success' && (editable || download)"
  64. >
  65. <span class="el-upload-list__item-delete">
  66. <i
  67. class="el-icon-view"
  68. v-if="
  69. isOnlineFile(file) &&
  70. download &&
  71. !isPictureFile(file) &&
  72. !onlineEdit
  73. "
  74. @click="_handleDownload(file, 'view')"
  75. ></i>
  76. <i
  77. class="el-icon-edit"
  78. v-if="onlineEdit"
  79. @click="_handleOnline(file)"
  80. ></i>
  81. <i
  82. class="el-icon-download"
  83. @click.stop="_handleDownload(file, 'down')"
  84. ></i>
  85. <i
  86. v-if="editable"
  87. class="el-icon-delete"
  88. @click.stop="_handleRemove(file)"
  89. ></i>
  90. </span>
  91. </span>
  92. </template>
  93. </el-upload>
  94. <BaseDialog
  95. v-drag
  96. :modal="false"
  97. :visible.sync="dialogVisible"
  98. @closed="_handlePreviewClosed"
  99. :title="downloadName"
  100. append-to-body
  101. >
  102. <img v-lazy="dialogImageUrl" width="100%" />
  103. </BaseDialog>
  104. <BaseDialog
  105. width="70%"
  106. :title="pdfFileName"
  107. :visible.sync="isShowPdf"
  108. :appendToBody="true"
  109. >
  110. <pdf :loadUrl="pdfUrl" v-if="isShowPdf" />
  111. </BaseDialog>
  112. </div>
  113. </template>
  114. <script>
  115. import { getFileList, saveFiles } from '@/model/upload'
  116. import { getOssInterimCredentials } from '@/model/procurement/spare'
  117. import { uuid } from '@/utils/assist'
  118. import downloadNow from '../WsDownload/download'
  119. import { EventBus } from 'base-core-lib'
  120. import pdf from '@/components/pdf/pdf'
  121. import { mapActions } from 'vuex'
  122. export default {
  123. name: 'WsUpload',
  124. components: {
  125. pdf,
  126. },
  127. props: {
  128. appendixIds: String,
  129. editable: {
  130. // 是否为编辑模式
  131. type: Boolean,
  132. default: true,
  133. },
  134. remarkWord: {
  135. // 是否有备注要求
  136. type: Boolean,
  137. default: true,
  138. },
  139. preview: {
  140. // 是否允许预览
  141. type: Boolean,
  142. default: true,
  143. },
  144. download: {
  145. // 是否允许下载
  146. type: Boolean,
  147. default: true,
  148. },
  149. showName: {
  150. // 是否显示文件名
  151. type: Boolean,
  152. default: true,
  153. },
  154. limit: {
  155. // 文件总数量限制
  156. type: Number,
  157. default: 10,
  158. },
  159. sizeLimit: {
  160. // 文件大小限制
  161. type: Number,
  162. default: undefined,
  163. },
  164. accept: {
  165. // 限制文件类型
  166. type: String,
  167. default:
  168. '.jpg, .jpeg, .png, .gif, .pdf, .doc, .docx, .xls, .xlsx, .zip, .rar, .eml, .mpeg, .avi, .asf, .wmv, .mpv, .rmvb, .rm, .flv, .mp4, .3pg, .ppt, .pptx, .txt',
  169. },
  170. ossKey: {
  171. type: String,
  172. required: true,
  173. },
  174. compId: {
  175. // 公司ID
  176. type: String,
  177. required: true,
  178. },
  179. vesselId: {
  180. // 船舶ID
  181. type: String,
  182. default: '',
  183. required: false,
  184. },
  185. tableName: {
  186. // 要保存的表的名字
  187. type: String,
  188. required: true,
  189. },
  190. onlineEdit: false,
  191. disabled: false,
  192. buttonName: {
  193. // 要保存的表的名字
  194. type: String,
  195. },
  196. },
  197. data() {
  198. return {
  199. pdfUrl: '',
  200. pdfFileName: '',
  201. isShowPdf: false,
  202. // vesselBankFlag: sessionStorage.getItem("ws-pf_serviceTypeFlag") == "true" ? "B" : "V",
  203. vesselBankFlag: 'V',
  204. curFileNum: 0,
  205. tempFileList: [],
  206. initFileList: [],
  207. loading: false, // 是否正在初始化filelsit
  208. fileList: [],
  209. removeList: [],
  210. dialogImageUrl: '',
  211. dialogVisible: false,
  212. downloadName: '',
  213. loadingView: '', // loading弹出层
  214. uploadParams: {
  215. companyId: this.compId,
  216. basePath: '', //config.getUploadPath(this.ossKey, this.compId)
  217. },
  218. clientFag: sessionStorage.getItem('ws-pf_clientFag'),
  219. }
  220. },
  221. computed: {
  222. formatTxt() {
  223. return this.accept
  224. .replace(/\./g, '')
  225. .replace(/ /g, '')
  226. .replace(/,/g, '、')
  227. },
  228. thisAppendixIds() {
  229. return this.appendixIds
  230. },
  231. _getFileImgs() {
  232. let arr = []
  233. for (let i of this.fileList) {
  234. if (this.isPictureFile(i)) {
  235. arr.push(i.url)
  236. }
  237. }
  238. return arr
  239. },
  240. },
  241. watch: {
  242. // 监听props.appendixIds, 变化时向服务器请求
  243. async thisAppendixIds(newV, oldV) {
  244. this.getDefaultFiles(newV)
  245. },
  246. },
  247. mounted() {
  248. this.getDefaultFiles(this.appendixIds)
  249. const handleChange = this.$refs.elUpload.$refs['upload-inner'].handleChange
  250. this.$refs.elUpload.$refs['upload-inner'].handleChange = (ev) => {
  251. this.initFileList = []
  252. this.curFileNum = ev.target.files.length
  253. for (let i = 0; i < this.curFileNum; i++) {
  254. this.initFileList.push(ev.target.files[i])
  255. this.tempFileList[i] = i
  256. }
  257. handleChange(ev)
  258. }
  259. },
  260. methods: {
  261. ...mapActions('common', ['uploadShipFiles']),
  262. //pdf预览
  263. async toOpen(scope) {
  264. const data = await this.getFileList({
  265. appendixIds: scope.row.filePathId,
  266. }).toPromise()
  267. let path = data[0] ? data[0].appendixPath : ''
  268. let filePath = this.$store.getters.baseInfo.fileUrl + '/' + path
  269. this.pdfUrl = filePath
  270. this.pdfFileName = scope.row.templateName
  271. this.isShowPdf = true
  272. },
  273. // handleChangeImage(file, fileList) {
  274. // console.info(file, fileList)
  275. // this.initFileList = fileList
  276. // this.tempFileList = fileList
  277. // },
  278. // 获取图片文件
  279. _getFileImg(file) {
  280. if (!file) {
  281. return ''
  282. }
  283. if (this.isPictureFile(file)) {
  284. if (file.url.indexOf('blob') === 0 || this.vesselBankFlag === 'V') {
  285. return file.url
  286. }
  287. return file.url + '?x-oss-process=image/resize,w_120,h_120'
  288. }
  289. return ''
  290. },
  291. async getDefaultFiles(appendixIds) {
  292. this.fileList = []
  293. if (appendixIds) {
  294. this.loading = true
  295. const list = await this._getFileList(appendixIds)
  296. this.loading = false
  297. if (list) {
  298. this.fileList = list.map((item, idx) => {
  299. return {
  300. appendixId: item.appendixId,
  301. name: item.appendixName,
  302. url: this.getFilePath(item.appendixPath),
  303. uid: uuid(),
  304. }
  305. })
  306. }
  307. }
  308. },
  309. // 处理上传按钮点击
  310. _handleUploadClick() {
  311. this.$refs.triggerDiv.click()
  312. },
  313. // 处理预览
  314. _handlePreview(file) {
  315. this.dialogImageUrl = file.url
  316. this.downloadName = file.name
  317. this.dialogVisible = true
  318. },
  319. // 处理预览关闭
  320. _handlePreviewClosed() {
  321. this.dialogImageUrl = ''
  322. this.downloadName = ''
  323. },
  324. // 处理删除
  325. _handleRemove(file) {
  326. if (file.appendixId) {
  327. // 这是要删除已经存在的附件
  328. const index = this.fileList.findIndex(
  329. (itm) => itm.appendixId === file.appendixId
  330. )
  331. this.fileList.splice(index, 1)
  332. this.removeList.push(file.appendixId)
  333. } else {
  334. // 这是删除已上传但还未保存的附件
  335. const index = this.fileList.findIndex((itm) => itm.uid === file.uid)
  336. this.fileList.splice(index, 1)
  337. }
  338. this.$emit('onChange', this.fileList.length)
  339. },
  340. // 自定义上传过程
  341. _handleRequest(param) {
  342. if (this.vesselBankFlag === 'V') {
  343. //船端
  344. this._uploadFilesShip(param)
  345. }
  346. },
  347. async _uploadFilesShip(param) {
  348. return new Promise(async (resolve, reject) => {
  349. this.showLoading()
  350. const file = param.file
  351. try {
  352. const data = await this.uploadShipFiles({
  353. file: file,
  354. companyId: this.compId || '',
  355. modelId: this.isNull(this.tableName)
  356. ? ''
  357. : this.tableName.split('_')[0],
  358. vesselId: this.vesselId || '',
  359. })
  360. this.$emit('uploadSuccess', data, file)
  361. const item = {
  362. appendixName: data.appendixName,
  363. appendixPath: data.appendixPath,
  364. appendixSize: this.toKB(file.size),
  365. // appendixType: "V",
  366. appendixType:
  367. sessionStorage.getItem('ws-pf_serviceTypeFlag') == 'true'
  368. ? 'B'
  369. : 'V',
  370. fromTableName: this.tableName,
  371. vesselId: this.vesselId || '',
  372. uid: file.uid,
  373. url: this.getFilePath(data.appendixPath),
  374. name: file.name,
  375. }
  376. let fileIndex = this.getFileIndex(item.uid)
  377. if (fileIndex >= 0) {
  378. this.tempFileList.splice(fileIndex, 1, item)
  379. this._handleSuccessOnce()
  380. }
  381. resolve()
  382. } catch (error) {
  383. this.handleError()
  384. reject()
  385. }
  386. })
  387. },
  388. // 处理单个文件上传成功
  389. _handleSuccessOnce() {
  390. this.curFileNum--
  391. if (this.curFileNum === 0) {
  392. this.fileList.push.apply(
  393. this.fileList,
  394. this.tempFileList.filter((item) => {
  395. return !this.isNull(item.uid)
  396. })
  397. )
  398. this.tempFileList = []
  399. this.$emit('onChange', this.fileList.length)
  400. this.hideLoading()
  401. }
  402. },
  403. // 处理在线编辑
  404. _handleOnline(file) {
  405. window.open(
  406. process.env.VUE_APP_BASE_API +
  407. '/office/file?fileId=' +
  408. file.appendixId +
  409. '&showSaveFlag=1'
  410. )
  411. },
  412. // 处理下载
  413. _handleDownload(file, type) {
  414. if (this.isOnlineFile(file) && type === 'view') {
  415. this.pdfUrl =
  416. file.url || this.$store.getters.baseInfo.fileUrl + file.appendixPath
  417. this.pdfFileName = file.appendixName || file.name
  418. this.isShowPdf = true
  419. return
  420. }
  421. downloadNow(file.url, file.name, this.vesselBankFlag, type)
  422. },
  423. _handleBeforeUpload(file) {
  424. let size = this.sizeLimit ? this.sizeLimit : 50
  425. if (file.size > size * 1024 * 1024) {
  426. EventBus.$emit('error', this.$t('showMessage.filesCannot') + size + 'M')
  427. return false
  428. }
  429. if (this.limit) {
  430. let limitFileNum = parseInt(this.limit)
  431. let currentFileNum = this.fileList.length + this.curFileNum
  432. if (limitFileNum > 1 && currentFileNum > limitFileNum) {
  433. this._handleExceed()
  434. return false
  435. }
  436. if (limitFileNum === 1) {
  437. this.fileList = []
  438. }
  439. }
  440. return true
  441. },
  442. //处理文件上传失败
  443. _handleError() {
  444. this.curFileNum--
  445. this.hideLoading()
  446. },
  447. _handleExceed() {
  448. EventBus.$emit('warning', `最多只能上传${this.limit}个文件`)
  449. },
  450. // 传入appendixIds 从服务器获取文件列表信息
  451. _getFileList(appendixIds) {
  452. return new Promise(async (next) => {
  453. try {
  454. next((await getFileList({ appendixIds }).toPromise()) || [])
  455. } catch (error) {
  456. next()
  457. }
  458. })
  459. },
  460. handleSaveBill() {
  461. return new Promise((resolve, reject) => {
  462. if (!this.removeList && this.fileList.length == 0) {
  463. resolve('')
  464. return
  465. }
  466. const oldAppendixIds = this.removeList.join()
  467. const newAppendixs = this.fileList
  468. const params = { newAppendixs, oldAppendixIds }
  469. // if (newAppendixs)
  470. saveFiles(params)
  471. .toPromise()
  472. .then((res) => {
  473. resolve(res.join())
  474. })
  475. .catch((err) => {
  476. EventBus.$emit('error', this.$t('showMessage.saveFilesError'))
  477. reject()
  478. })
  479. })
  480. },
  481. // 获取文件样式
  482. getFileClass(file) {
  483. const ext = this.getExtName(file.name)
  484. return 'ext ' + ext
  485. },
  486. // 是否为图片
  487. isPictureFile(file) {
  488. if (file && file.name) {
  489. const name = this.getExtName(file.name)
  490. return (
  491. name === 'jpg' ||
  492. name === 'png' ||
  493. name === 'jpeg' ||
  494. name === 'gif' ||
  495. name === 'webp' ||
  496. name === 'bmp' ||
  497. name === 'JPG' ||
  498. name === 'PNG' ||
  499. name === 'JPEG' ||
  500. name === 'GIF' ||
  501. name === 'WEBP' ||
  502. name === 'BMP'
  503. )
  504. }
  505. return false
  506. },
  507. // 是否为在线打开文件
  508. isOnlineFile(file) {
  509. if (file && file.name) {
  510. const name = this.getExtName(file.name)
  511. return name === 'pdf' || name === 'tet'
  512. }
  513. return false
  514. },
  515. getOssInter() {
  516. return new Promise(async (next) => {
  517. try {
  518. next(await getOssInterimCredentials().toPromise())
  519. } catch (error) {
  520. next()
  521. }
  522. })
  523. },
  524. getFileIndex(uid) {
  525. for (let i = 0; i < this.initFileList.length; i++) {
  526. if (this.initFileList[i].uid === uid) {
  527. return i
  528. }
  529. }
  530. return -1
  531. },
  532. // 显示loading
  533. showLoading() {
  534. this.loadingView = this.$loading({
  535. lock: true,
  536. text: 'Loading',
  537. spinner: 'el-icon-loading',
  538. background: 'rgba(0, 0, 0, 0.7)',
  539. target: document.querySelector('.div1'),
  540. })
  541. },
  542. // 隐藏loading
  543. hideLoading() {
  544. this.loadingView.close()
  545. },
  546. // 获取后缀名
  547. getExtName(url) {
  548. if (!url) {
  549. return url
  550. }
  551. url = url.substr(url.lastIndexOf('.') + 1)
  552. if (url.indexOf('?') >= 0) {
  553. url = url.substr(url.indexOf('?'))
  554. }
  555. return url
  556. },
  557. checkUrl(path) {
  558. if (path.indexOf('http://') > -1 || path.indexOf('https://') > -1) {
  559. let pathSplit = path.split('.com/')
  560. if (pathSplit) {
  561. path = pathSplit[1]
  562. }
  563. }
  564. return path
  565. },
  566. getFilePath(path) {
  567. // let sysUrl = process.env.NODE_ENV === "production"?"http://" + window.location.host+"/":"http://product-dev.winsea.com/";
  568. let sysUrl = this.$store.getters.baseInfo.fileUrl
  569. path = this.checkUrl(path)
  570. // if (this.clientFag === "B") {
  571. // // sysUrl+="pb/"
  572. // }
  573. return sysUrl + this.slash(path)
  574. },
  575. // 字节转KB
  576. toKB(bt) {
  577. return (bt / 1024).toFixed(2) + 'KB'
  578. },
  579. clearFiles() {
  580. // debugger
  581. this.fileList = []
  582. },
  583. // 反斜杠转斜杠
  584. slash(str) {
  585. return str.replace(/\\/g, '/')
  586. },
  587. },
  588. }
  589. </script>
  590. <style lang="scss" scoped>
  591. $picture-size: 110px;
  592. $ctrl-margin-left: 10px;
  593. .archived-history
  594. .upButton
  595. /deep/
  596. .el-upload-list__item-delete:nth-last-of-type(1) {
  597. display: inline-block !important;
  598. }
  599. .ws-upload {
  600. /*.upload-noramark-btn{*/
  601. /* padding: 0px;*/
  602. /* border: none;*/
  603. /*}*/
  604. padding-bottom: 10px;
  605. .trigger-group {
  606. margin-bottom: 10px;
  607. .upload-btn {
  608. display: inline-block;
  609. border-radius: 4px;
  610. }
  611. .tip {
  612. // display: inline-block;
  613. margin: 0;
  614. padding: 0;
  615. font-size: 12px;
  616. line-height: 17px;
  617. color: #999;
  618. margin-bottom: 4px;
  619. margin-top: 4px;
  620. vertical-align: middle;
  621. white-space: initial;
  622. text-align: left;
  623. width: calc(100% - 100px);
  624. }
  625. }
  626. /deep/ .thumbnail-group {
  627. width: $picture-size;
  628. height: $picture-size;
  629. .el-upload-list__item-thumbnail {
  630. display: block;
  631. border-radius: 6px;
  632. border: 1px solid #ccd6e3;
  633. background-color: #fff;
  634. }
  635. }
  636. /deep/.winsea-picture-view ul {
  637. padding: 0;
  638. }
  639. /deep/ .el-upload-list__item-actions {
  640. height: $picture-size;
  641. overflow: hidden;
  642. border-radius: 6px;
  643. align-items: center;
  644. display: flex;
  645. justify-content: center;
  646. z-index: 100;
  647. height: 30px;
  648. top: 80px;
  649. }
  650. .fileName {
  651. font-size: 12px;
  652. color: #666;
  653. margin: 0;
  654. text-align: center;
  655. margin-top: 4px;
  656. margin-bottom: 4px;
  657. white-space: nowrap;
  658. overflow: hidden;
  659. text-overflow: ellipsis;
  660. }
  661. /deep/
  662. .el-upload-list--picture-card
  663. .el-upload-list__item-actions
  664. span
  665. + span {
  666. margin-left: $ctrl-margin-left;
  667. }
  668. /deep/ .el-upload.el-upload--picture-card {
  669. display: none;
  670. }
  671. /deep/ .el-upload-list__item {
  672. width: $picture-size;
  673. height: auto;
  674. border: 0;
  675. background: none;
  676. }
  677. .ws-upload-progress {
  678. width: 84%;
  679. top: 88px;
  680. }
  681. .ext {
  682. background-size: $picture-size * 0.7;
  683. background-repeat: no-repeat;
  684. background-position: center;
  685. }
  686. .doc {
  687. background-image: url('~@/assets/images/common/upload/doc.png');
  688. }
  689. .docx {
  690. background-image: url('~@/assets/images/common/upload/docx.png');
  691. }
  692. .eml {
  693. background-image: url('~@/assets/images/common/upload/eml.png');
  694. }
  695. .ppt {
  696. background-image: url('~@/assets/images/common/upload/PPT.png');
  697. }
  698. .pptx {
  699. background-image: url('~@/assets/images/common/upload/PPT.png');
  700. }
  701. .pdf {
  702. background-image: url('~@/assets/images/common/upload/pdf.png');
  703. }
  704. .txt {
  705. background-image: url('~@/assets/images/common/upload/txt.png');
  706. }
  707. .mp4,
  708. .avi,
  709. .mov,
  710. .rmvb,
  711. .rm,
  712. .flv {
  713. background-image: url('~@/assets/images/common/upload/video.jpg');
  714. background-size: $picture-size;
  715. }
  716. .rar {
  717. background-image: url('~@/assets/images/common/upload/rar.png');
  718. }
  719. .xls {
  720. background-image: url('~@/assets/images/common/upload/xls.png');
  721. }
  722. .xlsx {
  723. background-image: url('~@/assets/images/common/upload/xlsx.png');
  724. }
  725. .zip {
  726. background-image: url('~@/assets/images/common/upload/zip.png');
  727. }
  728. }
  729. // 取消ele动画
  730. /deep/ .el-list-leave-active {
  731. transition: all 0s;
  732. }
  733. /deep/ .el-list-enter-active {
  734. transition: all 0s;
  735. }
  736. /*.el-button--text{*/
  737. /* color: #666666;*/
  738. /*}*/
  739. /*.el-button--text:hover{*/
  740. /* color: #4a89f1;*/
  741. /*}*/
  742. /*.el-button--text:focus{*/
  743. /* color: #ffffff;*/
  744. /*}*/
  745. .operate-bg:hover {
  746. opacity: 0;
  747. }
  748. </style>