index.vue 19 KB

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