index.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  1. <!--
  2. * @Descripttion: POCT文件培训
  3. * @version: 1.0
  4. * @Author: Liu_jiaYin
  5. * @Date: 2024-03-01 13:47:32
  6. * @LastEditors: Do not edit
  7. * @LastEditTime: 2024-04-26 16:04:02
  8. -->
  9. <template>
  10. <el-dialog
  11. :visible.sync="dialogVisible"
  12. fullscreen
  13. append-to-body
  14. custom-class="ibps-file-preview-dialog"
  15. :show-close="false"
  16. >
  17. <template #title>
  18. <el-row>
  19. <el-col :span="11" class="titleHander">{{ title }}</el-col>
  20. <el-col
  21. :span="3"
  22. class="read"
  23. style="text-align: right"
  24. >阅读量:{{ lookNum }}</el-col>
  25. <el-col :span="10" style="text-align: right">
  26. <!-- <el-popover
  27. v-model="deleteVisible"
  28. placement="top"
  29. width="160"
  30. >
  31. <p>文件删除之后将不能查看,确定要删除该文件吗?</p>
  32. <div style="text-align: right; margin: 0">
  33. <el-button
  34. size="mini"
  35. type="text"
  36. @click="deleteVisible = false"
  37. >取消</el-button>
  38. <el-button
  39. type="primary"
  40. size="mini"
  41. @click="deleteFile"
  42. >确定</el-button>
  43. </div>
  44. <el-button
  45. slot="reference"
  46. type="danger"
  47. icon="el-icon-delete"
  48. class="deleteBtn"
  49. @click="deleteVisible = true"
  50. >删除</el-button>
  51. </el-popover>
  52. <el-button
  53. type="primary"
  54. icon="el-icon-view"
  55. @click="lookFile"
  56. >查看文件信息</el-button>
  57. <el-button
  58. type="primary"
  59. icon="el-icon-s-fold"
  60. @click="hideLeft"
  61. >{{ leftContent }}</el-button> -->
  62. <el-button
  63. type="primary"
  64. icon="el-icon-download"
  65. @click="updateFile"
  66. >下载文件</el-button>
  67. <el-button
  68. type="danger"
  69. icon="el-icon-close"
  70. @click="closeDialog"
  71. >关闭</el-button>
  72. </el-col>
  73. </el-row>
  74. </template>
  75. <div>
  76. <el-row>
  77. <el-col v-if="leftShow" :span="4" class="left-content">
  78. <div class="left-title">文件修订历史</div>
  79. <el-timeline :reverse="reverse">
  80. <el-timeline-item
  81. v-for="(activity, index) in leftData"
  82. :key="index"
  83. :timestamp="'发布日期:' + activity.fa_fang_ri_qi_"
  84. :type="index === activeIndex ? type : ''"
  85. @click.stop.native="toggleActive(activity, index)"
  86. >
  87. <div class="timeline-content">
  88. <el-tooltip
  89. class="itemStyle"
  90. effect="dark"
  91. placement="right-end"
  92. :content="showContent(activity, index)"
  93. >
  94. <div>
  95. <!-- <div>版本号:{{ activity.ban_ben_ }}/修订人:{{ getUserName(activity.bian_zhi_ren_) }}</div> -->
  96. <el-collapse
  97. v-model="activeName"
  98. accordion
  99. >
  100. <el-collapse-item :name="index + 1">
  101. <template slot="title">
  102. <div>
  103. 版本号:{{
  104. activity.ban_ben_
  105. }}&nbsp;&nbsp;&nbsp;&nbsp;修订人:{{
  106. getUserName(
  107. activity.bian_zhi_ren_
  108. )
  109. }}
  110. </div>
  111. </template>
  112. <!-- 附件 -->
  113. <div
  114. v-if="
  115. activity.zhen_fu_jian_
  116. "
  117. >
  118. <ibps-attachment
  119. v-model="
  120. activity.zhen_fu_jian_
  121. "
  122. allow-download
  123. download
  124. multiple
  125. accept="*"
  126. store="id"
  127. readonly
  128. />
  129. </div>
  130. <div v-else>
  131. <i
  132. class="el-icon-warning-outline"
  133. type="warning"
  134. >
  135. 暂无附件</i>
  136. </div>
  137. </el-collapse-item>
  138. </el-collapse>
  139. </div>
  140. </el-tooltip>
  141. </div>
  142. </el-timeline-item>
  143. </el-timeline>
  144. </el-col>
  145. <el-col
  146. :span="computedSpan"
  147. ><fView
  148. v-if="refresh"
  149. ref="fvView"
  150. :option-file="optionFile"
  151. :operation_status="operation_status"
  152. @hadLoadedFile="hadLoadedFile"
  153. /></el-col>
  154. </el-row>
  155. </div>
  156. <!-- 查看文件信息弹窗 @close="closeDialog"-->
  157. <FileDialog
  158. v-if="innerVisible"
  159. :show-list="showList"
  160. :dig-data="digData"
  161. :inner-visible="innerVisible"
  162. :file-index="fileIndex"
  163. @pause="pauseTimer"
  164. @start="startTimer"
  165. @update-inner-visible="updateInnerVisible"
  166. />
  167. </el-dialog>
  168. </template>
  169. <script>
  170. /**
  171. * 文件预览
  172. * 1、'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx' 类型支持
  173. * 2、图片支持缩放
  174. * 3、音频,语音支持
  175. * ==================
  176. * 下一版本支持
  177. * 1、pdf支持缩放
  178. * 2、音频,语音多格式支持
  179. * 3、压缩包支持
  180. */
  181. import fView from '@/business/platform/file/attachment/editFile/fView.vue'
  182. import ViewFile from '@/views/viewFile/index.vue'
  183. import Template from '@/business/platform/form/form-print/template.vue'
  184. import curdPost from '@/business/platform/form/utils/custom/joinCURD.js'
  185. import FileDialog from './fileDialog.vue'
  186. import IbpsAttachment from '@/business/platform/file/attachment/selector'
  187. // import * as selectbox from 'bpmn-js-properties-panel/lib/factory/SelectEntryFactory'
  188. // import func from 'vue-editor-bridge'
  189. export default {
  190. name: 'file-training',
  191. components: {
  192. fView,
  193. ViewFile,
  194. Template,
  195. FileDialog,
  196. 'ibps-attachment': IbpsAttachment
  197. },
  198. props: {
  199. visible: {
  200. type: Boolean,
  201. default: false
  202. },
  203. fileInfos: {
  204. type: Array,
  205. default: () => {}
  206. }
  207. },
  208. data () {
  209. const { userList, userId, positionList, isSuper } = this.$store.getters
  210. const role = positionList
  211. // const userId = this.$store.getters.userInfo.employee.id// 本人修改
  212. return {
  213. activeName: 1,
  214. type: 'success',
  215. curFileName: '',
  216. curid: '',
  217. timeId: '',
  218. dialogVisible: false,
  219. operation_status: 'fileTraining',
  220. title: '',
  221. browseTime: 0, // 浏览时长初始值为 0
  222. clearTimeSet: null,
  223. optionFile: {},
  224. tmpId: '',
  225. upFunc: () => {},
  226. height: 0,
  227. out: false, // 记录鼠标是否离开过被监听的位置,未离开过则startTimer不启用
  228. hadLoad: false,
  229. refresh: false,
  230. // 本人修改
  231. leftShow: false,
  232. scrollTimeout: null,
  233. reverse: false,
  234. fileInfo: '',
  235. fileJie: '',
  236. leftData: [],
  237. activeIndex: 0,
  238. userList: userList,
  239. userId: userId,
  240. innerVisible: false,
  241. currentPage: 1,
  242. pageSize: 10,
  243. lookNum: null,
  244. showList: [],
  245. digData: null,
  246. paused: false,
  247. role: role,
  248. isSuper: isSuper,
  249. deleteVisible: false,
  250. leftContent: '隐藏修订历史'
  251. }
  252. },
  253. computed: {
  254. computedSpan () {
  255. return this.leftShow ? 20 : 24
  256. },
  257. fileIndex () {
  258. if (this.leftData.length <= 0) {
  259. return 0
  260. }
  261. return this.leftData.findIndex((i) => i === this.digData)
  262. }
  263. },
  264. watch: {
  265. visible: {
  266. immediate: true,
  267. handler (val) {
  268. this.digData = this.leftData[0]
  269. }
  270. },
  271. leftShow: {
  272. immediate: true, // 强制执行一次
  273. handler (val) {
  274. if (val) {
  275. this.leftContent = '隐藏修订历史'
  276. return
  277. }
  278. this.leftContent = '显示修订历史'
  279. }
  280. },
  281. fileInfos: {
  282. handler (newVal) {
  283. this.leftData = newVal
  284. const temp = JSON.parse(JSON.stringify(newVal))
  285. temp.sort((a, b) => {
  286. return (
  287. new Date(b.fa_fang_shi_jian_).getTime() -
  288. new Date(a.fa_fang_shi_jian_).getTime()
  289. )
  290. })
  291. if (newVal !== temp) {
  292. this.leftData = temp
  293. }
  294. temp.forEach((val) => {
  295. this.fileShow(temp[0])
  296. })
  297. },
  298. deep: true,
  299. immediate: true
  300. },
  301. browseTime: {
  302. handler: function (val, oldVal) {
  303. if (this.curFileName) {
  304. this.title = `文件:《 ${this.curFileName} 》,查阅时长:${val}秒`
  305. } else {
  306. this.title = `文件:《 ${this.leftData[0]?.FILE_NAME_} 》,查阅时长:${val}秒`
  307. }
  308. if (!this.lookNum) {
  309. if (this.leftData[0]?.id) {
  310. this.checkNum(this.leftData[0])
  311. }
  312. }
  313. },
  314. immediate: true
  315. },
  316. dialogVisible: {
  317. handler: function (val, oldVal) {
  318. if (!val) {
  319. this.closeDialog()
  320. }
  321. }
  322. }
  323. },
  324. beforeDestroy () {
  325. this.fileType = ''
  326. this.option = {}
  327. // 本人修改
  328. this.removeMouseMoveListener()
  329. },
  330. mounted () {
  331. this.height = this.getDialogHeightHeight()
  332. // 页面切换时改变计时状态
  333. document.addEventListener('visibilitychange', this.handlePageChange)
  334. this.checkDialogBody()
  335. },
  336. methods: {
  337. getUserName (data) {
  338. const user = this.userList.find((item) => item.userId === data)
  339. return user ? user.userName : '未知用户'
  340. },
  341. showContent (activity, index) {
  342. if (activity.cao_zuo_lei_xing_ === '新增') {
  343. return '第一版本'
  344. }
  345. return activity.xiu_ding_nei_rong
  346. ? activity.xiu_ding_nei_rong
  347. : '无修订原因'
  348. },
  349. handlePageChange () {
  350. if (document.visibilityState === 'hidden') {
  351. this.pauseTimer()
  352. } else {
  353. this.startTimer()
  354. }
  355. },
  356. closeDialog () {
  357. // 关闭时存入查阅时间
  358. if (this.browseTime && this.browseTime > 0 && this.timeId) {
  359. this.handleUpdate()
  360. }
  361. this.$emit('colseVisible', false)
  362. const fvView = this.$refs.fvView
  363. // 销毁子组件方法
  364. fvView.destoryZiComponent()
  365. if (this.browseTime >= 30) {
  366. this.upFunc(this.tmpId, this.browseTime)
  367. }
  368. // 针对关闭窗口或者浏览器的
  369. if (this.clearTimeSet != null) {
  370. clearInterval(this.clearTimeSet)
  371. this.clearTimeSet = null
  372. }
  373. this.leftShow = true
  374. this.out = false
  375. this.browseTime = 0
  376. // this.curFileName = ''// 本人添加
  377. // this.lookNum = null
  378. // this.showList = []
  379. // this.leftData = []
  380. // this.digData = null
  381. },
  382. hadLoadedFile (v) {
  383. // 计时开始,添加查看记录
  384. if (!this.curid) {
  385. this.handleAdd(this.leftData[0]?.id, 0)
  386. }
  387. this.setBrowseTime()
  388. this.hadLoad = true
  389. },
  390. setBrowseTime () {
  391. // 设置定时器
  392. this.clearTimeSet = setInterval(() => {
  393. this.browseTime++
  394. }, 1000)
  395. },
  396. getDialogHeightHeight () {
  397. return (
  398. (document.documentElement.clientHeight ||
  399. document.body.clientHeight) -
  400. 60 +
  401. 'px'
  402. )
  403. },
  404. startTimer () {
  405. if (
  406. this.dialogVisible &&
  407. this.hadLoad &&
  408. this.out &&
  409. this.clearTimeSet == null
  410. ) {
  411. this.clearTimeSet = setInterval(() => {
  412. this.browseTime++
  413. }, 1000)
  414. }
  415. },
  416. pauseTimer () {
  417. if (this.dialogVisible) {
  418. this.out = true
  419. clearInterval(this.clearTimeSet)
  420. this.clearTimeSet = null
  421. }
  422. },
  423. async idChange (id) {
  424. const sql = `select id_ FROM t_wjylb WHERE wen_jian_zhu_jian= '${id}'`
  425. return new Promise((resolve, reject) => {
  426. this.$common
  427. .request('sql', sql)
  428. .then((res) => {
  429. const { data = [] } = res.variables || {}
  430. const firstId = data[0]?.id_
  431. resolve(firstId) // 解析 Promise 时返回 firstId
  432. })
  433. .catch((error) => {
  434. reject(error) // 捕获错误并拒绝 Promise
  435. })
  436. })
  437. },
  438. toggleActive (activity, index) {
  439. if (this.activeIndex === index) {
  440. return
  441. }
  442. // 切换文件修订历史时,保存上一个文件查看记录,新增当前文件查看记录
  443. if (this.browseTime && this.browseTime > 0 && this.timeId) {
  444. this.handleUpdate()
  445. this.handleAdd(this.curid || this.leftData[0]?.id, 0)
  446. }
  447. this.activeIndex = index
  448. this.digData = activity
  449. this.curid = activity.id
  450. this.fileShow(activity)
  451. if (this.browseTime >= 30) {
  452. this.upFunc(this.tmpId, this.browseTime)
  453. }
  454. clearInterval(this.clearTimeSet)
  455. this.browseTime = 0
  456. this.curFileName = activity.FILE_NAME_
  457. this.checkNum(activity) // 阅读量
  458. // this.$forceUpdate()// 触发监听器
  459. },
  460. // 阅读量函数
  461. async checkNum (activity) {
  462. const sql = `select * from t_wjcyjl WHERE t_wjcyjl.parent_id_ = '${activity.id}' order by create_time_ desc`
  463. await this.$common.request('sql', sql).then((res) => {
  464. const { data = [] } = res.variables || {}
  465. this.lookNum = data.length
  466. this.showList = data
  467. })
  468. },
  469. handleAdd (fileId, time) {
  470. const addParams = {
  471. tableName: 't_wjcyjl',
  472. paramWhere: [
  473. {
  474. bian_zhi_ren_: this.userId,
  475. bian_zhi_shi_jian: this.$common.getDateNow(19),
  476. parent_id_: fileId,
  477. shi_chang_: time
  478. }
  479. ]
  480. }
  481. curdPost('add', addParams).then((res) => {
  482. // this.refreshData()
  483. const { cont = [] } = res.variables || {}
  484. this.timeId = cont[0]?.id_ || ''
  485. })
  486. },
  487. handleUpdate () {
  488. const updateParams = {
  489. tableName: 't_wjcyjl',
  490. updList: [
  491. {
  492. where: {
  493. id_: this.timeId
  494. },
  495. param: {
  496. shi_chang_: this.browseTime
  497. }
  498. }
  499. ]
  500. }
  501. curdPost('update', updateParams).then((res) => {})
  502. },
  503. hideLeft () {
  504. this.leftShow = !this.leftShow
  505. },
  506. async lookFile () {
  507. // console.log(document.querySelector('iframe').contentWindow.document)
  508. // console.log(document.querySelector('iframe').contentWindow.document.body.innerHTML);
  509. if (this.digData) {
  510. await this.checkNum(this.digData)
  511. } else {
  512. this.digData = this.leftData[0]
  513. await this.checkNum(this.digData)
  514. }
  515. this.innerVisible = true
  516. },
  517. a () {
  518. fetch(this.optionFile.url)
  519. .then((response) => {
  520. if (response.ok) {
  521. // 如果响应状态码为 200-299,则创建下载链接
  522. const a = document.createElement('a')
  523. a.href = this.optionFile.url
  524. a.download = this.optionFile.data.fileName
  525. document.body.appendChild(a)
  526. a.click()
  527. a.remove()
  528. } else {
  529. // 如果响应状态码不是 200-299,则显示错误消息
  530. this.$message({
  531. message: '文件未找到,请联系管理员',
  532. type: 'warning'
  533. })
  534. console.error(
  535. '文件未找到:',
  536. response.status,
  537. response.statusText
  538. )
  539. }
  540. })
  541. .catch((error) => {
  542. // 捕获网络请求错误
  543. this.$message({
  544. message: '网络请求失败,请联系管理员',
  545. type: 'warning'
  546. })
  547. console.error('网络请求失败:', error)
  548. })
  549. },
  550. deleteFile () {
  551. this.deleteVisible = false
  552. // const roleKey = ['xtgljs', 'syszr', 'wjgly', 'wjglzzc']
  553. const roleKey = ['xtgljs']
  554. const curRole = this.role.map((i) => i.alias)
  555. const isPower = curRole.some((item) => roleKey.includes(item))
  556. if (this.isSuper || isPower) {
  557. const deleteParams = {
  558. tableName: 't_wjxxb',
  559. paramWhere: { id_: this.leftData[0].id }
  560. }
  561. curdPost('delete', deleteParams).then(() => {
  562. this.$message({
  563. message: '删除成功!',
  564. type: 'warning'
  565. })
  566. this.dialogVisible = false
  567. })
  568. return
  569. }
  570. this.$message({
  571. message: '您还没有权限,请联系管理员',
  572. type: 'warning'
  573. })
  574. },
  575. // closeDialog1 (val) {
  576. // this.innerVisible = val
  577. // },
  578. updateFile () {
  579. const hasRole = localStorage.getItem('hasHighRole') === '1'
  580. // const roleKey = ['xtgljs', 'wjglzzc', 'wjgly', 'zhsfzr']
  581. // const curRole = this.role.map(i => i.alias)
  582. // const isPower = curRole.some(i => roleKey.includes(i))
  583. if (this.isSuper || hasRole) {
  584. const a = document.createElement('a')
  585. a.href = this.optionFile.url
  586. a.download = this.optionFile.data.fileName
  587. document.body.appendChild(a)
  588. a.click()
  589. a.remove()
  590. return
  591. }
  592. this.$message({
  593. message: '您还没有权限,请联系管理员',
  594. type: 'warning'
  595. })
  596. },
  597. fileShow (val) {
  598. return new Promise((resolve, reject) => {
  599. try {
  600. this.dialogVisible = true
  601. this.title = `文件:《${val.FILE_NAME_}》`
  602. this.idChange(val.id).then((res) => {
  603. this.tmpId = res
  604. if (val.func) {
  605. this.upFunc = val.func
  606. }
  607. const data = {
  608. ext: val.fileInfos.EXT_,
  609. fileName: val.fileInfos.FILE_NAME_,
  610. id: val.fileInfos.ID_,
  611. index: 0,
  612. totalBytes: val.fileInfos.TOTAL_BYTES_
  613. }
  614. this.optionFile.url = `${this.$onlyofficeApi}/file/download?attachmentId=${data.id}`
  615. this.optionFile.editUrl = `${this.$onlyofficeApi}/file/editCallback?fileName=${data.fileName}&fileType=${data.ext}&type=fileTraining&id=${data.id}`
  616. this.optionFile.title = data.fileName // 文件名称
  617. this.optionFile.fileType = data.ext // 类型
  618. this.optionFile.data = data // 记录编制的位置,需要替换。
  619. this.optionFile.data.index = data.index
  620. // 使用 v-if 实现组件刷新功能
  621. this.refresh = false
  622. this.$nextTick(() => {
  623. this.refresh = true
  624. resolve() // 异步操作完成后 resolve
  625. })
  626. })
  627. } catch (error) {
  628. reject(error)
  629. }
  630. })
  631. },
  632. // 排序函数
  633. sortByFabushijianDesc (data) {
  634. return data.sort((a, b) => {
  635. const dateA = new Date(a.fa_fang_shi_jian_)
  636. const dateB = new Date(b.fa_fang_shi_jian_)
  637. return dateB - dateA // 降序排序
  638. })
  639. },
  640. formattedTimestamp (timestamp) {
  641. const date = new Date(timestamp)
  642. // 获取年月日时分秒
  643. const year = date.getFullYear()
  644. const month = String(date.getMonth() + 1).padStart(2, '0')
  645. const day = String(date.getDate()).padStart(2, '0')
  646. const hours = String(date.getHours()).padStart(2, '0')
  647. const minutes = String(date.getMinutes()).padStart(2, '0')
  648. const seconds = String(date.getSeconds()).padStart(2, '0')
  649. // 格式化日期
  650. return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
  651. },
  652. checkDialogBody () {
  653. const intervalId = setInterval(() => {
  654. if (document.querySelector('iframe')) {
  655. this.dialogBody = document.querySelector('iframe')
  656. this.addMouseMoveListener()
  657. clearInterval(intervalId)
  658. }
  659. }, 200)
  660. },
  661. addMouseMoveListener () {
  662. if (this.dialogBody && !this.mouseMoveHandler) {
  663. this.mouseMoveHandler = () => {
  664. console.log('鼠标移动事件!!!!')
  665. }
  666. this.dialogBody.addEventListener(
  667. 'mousemove',
  668. this.mouseMoveHandler,
  669. true
  670. )
  671. }
  672. },
  673. removeMouseMoveListener () {
  674. if (this.dialogBody && this.mouseMoveHandler) {
  675. this.dialogBody.removeEventListener(
  676. 'mousemove',
  677. this.mouseMoveHandler,
  678. true
  679. )
  680. this.mouseMoveHandler = null
  681. }
  682. },
  683. updateInnerVisible (newVal) {
  684. this.innerVisible = newVal
  685. }
  686. }
  687. }
  688. </script>
  689. <style lang="scss">
  690. .ibps-file-preview-dialog {
  691. width: 80%;
  692. z-index: 99999;
  693. .el-dialog__body {
  694. padding: 0;
  695. }
  696. .file-type-txt {
  697. height: calc(88vh) !important;
  698. }
  699. .itemStyle:hover {
  700. cursor: pointer;
  701. }
  702. .titleHander,
  703. .read {
  704. line-height: 32px;
  705. }
  706. .deleteBtn {
  707. margin: 0 10px 0 0;
  708. }
  709. }
  710. .left-content {
  711. .left-title {
  712. text-align: left;
  713. padding: 15px;
  714. font-size: 18px;
  715. font-weight: 600;
  716. }
  717. .el-timeline {
  718. padding: 0 15px;
  719. }
  720. /* 清除分割线 */
  721. .el-collapse-item__wrap,
  722. .el-collapse-item__header {
  723. border-bottom: none !important;
  724. }
  725. .el-collapse {
  726. border: none !important;
  727. }
  728. .el-collapse-item__header {
  729. height: 30px;
  730. line-height: 30px;
  731. }
  732. .el-collapse-item__content {
  733. padding: 0px;
  734. }
  735. .el-timeline-item {
  736. padding-bottom: 10px;
  737. }
  738. }
  739. // .file-read-num{
  740. // display: inline-block;
  741. // margin-left: 60px;
  742. // }
  743. </style>