图书馆综合管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

595 lines
22 KiB

7 months ago
7 months ago
7 months ago
6 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
6 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
6 months ago
7 months ago
6 months ago
7 months ago
7 months ago
  1. <template>
  2. <div class="app-container">
  3. <div class="venue-header">
  4. <h4><i class="iconfont icon-shujia" />架位列表</h4>
  5. <span class="bookshelf-area">{{ floorName }} - {{ regionName }}</span>
  6. <p><i class="iconfont icon-gongsi" />{{ user.fonds.fondsName }}</p>
  7. </div>
  8. <div class="bookshelf-main">
  9. <div class="bookshelf-top">
  10. <ul class="bookshelf-info">
  11. <li><p>书架名称</p><span>{{ bookShelfDetails && bookShelfDetails.shelfName }}</span></li>
  12. <li><p>书架规格</p><span>{{ bookShelfDetails && bookShelfDetails.shelfFloor + ' X ' + bookShelfDetails.shelfShelf }}</span></li>
  13. <li><p>/双面</p><span>{{ bookShelfDetails && bookShelfDetails.rowType === 1 ? '单面' :'双面' }}</span></li>
  14. <li><p>倒架规则</p><span>{{ bookShelfDetails && bookShelfDetails.shelfRule === 1 ? '无序' :'有序' }}</span></li>
  15. <li><p>错架判断</p><span>{{ bookShelfDetails && bookShelfDetails.shelfErrorJudge === 1 ? '书架' :'格子' }}</span></li>
  16. <!-- <li><p>前端测试用-架号顺序</p><span>{{ bookShelfDetails && bookShelfDetails.shelfType === 1 ? '始终最左边为第1架(S型排架)' : (bookShelfDetails.shelfType === 2 ? 'A面最左为第1架(B面最左为最后1架)' : 'B面最左为第1架(A面最左为最后1架)') }}</span></li>
  17. <li><p>前端测试用-层号顺序</p><span>{{ bookShelfDetails && bookShelfDetails.floorType === 1 ? '最顶层为第一层(从上至下)' :'最底层为第一层(从下至上)' }}</span></li> -->
  18. </ul>
  19. <div class="bookshelf-button">
  20. <el-button size="mini" @click="doExport">
  21. <i class="iconfont icon-daochu" />
  22. 导出层位编码
  23. </el-button>
  24. <el-button size="mini" :disabled="!cellInfo.cameraId" @click="handleViewVideo(cellInfo.cameraId)">
  25. <i class="iconfont icon-yulan" />
  26. {{ cellInfo.cameraId ? '摄像头预览' : '未绑定摄像头' }}
  27. </el-button>
  28. </div>
  29. </div>
  30. <div class="bookshelf-layer-info">
  31. <div class="bookshelf-left">
  32. <swiper
  33. ref="swiperTitle"
  34. class="swiper-title"
  35. :options="swiperOptionTitle"
  36. :auto-update="true"
  37. :auto-destroy="true"
  38. :delete-instance-on-destroy="true"
  39. :cleanup-styles-on-destroy="true"
  40. >
  41. <swiper-slide
  42. v-for="(item, index) of tabListData"
  43. ref="swiperSlideItem"
  44. :key="'name' + index"
  45. :iname="item.name"
  46. class="swiper-slide-title"
  47. >
  48. <div
  49. class="tab-name"
  50. :class="{ active: index === swiperActiveIndex }"
  51. @click="handleSlidClickFun(index)"
  52. >
  53. {{ item.name }}
  54. </div>
  55. </swiper-slide>
  56. </swiper>
  57. <swiper
  58. ref="swiperContent"
  59. class="swiper-content"
  60. :style="rowStyle"
  61. :options="swiperOptionContent"
  62. :auto-update="true"
  63. :auto-destroy="true"
  64. :delete-instance-on-destroy="true"
  65. :cleanup-styles-on-destroy="true"
  66. >
  67. <swiper-slide
  68. v-for="(item, index) of tabListData"
  69. :key="'content' + index"
  70. class="swiper-slide-content"
  71. >
  72. <ul class="cabinet-row" :style="rowStyle">
  73. <li v-for="(shelf,i) in booShelfGrid" :key="i" class="cabinet-cell" :style="cellStyle" :class="{ active: i === cellIndex }" @click="handleCellCurrent(shelf,i)">
  74. <span>{{ shelf.gridName | removeQUPrefix }}</span>
  75. </li>
  76. </ul>
  77. </swiper-slide>
  78. </swiper>
  79. </div>
  80. <div class="bookshelf-right-info">
  81. <div class="layer-status">
  82. <span v-if="cellInfo.startSortmark && cellInfo.endSortmark && checkValue === 'true'" class="row-state end-state">正常盘点</span>
  83. <span v-if="!cellInfo.startSortmark && !cellInfo.endSortmark && checkValue === 'true'" class="row-state soon-state">待初始化</span>
  84. <span v-if="checkValue === 'false'" class="row-state cancel-state">停止盘点</span>
  85. <span v-if="bookSortValue === 'false'" class="row-state other-state">无序倒架</span>
  86. <span v-else class="row-state ing-state">有序倒架</span>
  87. </div>
  88. <h5 class="layer-name">{{ cellInfo.gridName | removeQUPrefix }}</h5>
  89. <div class="layer-code-sort">
  90. <ul>
  91. <!-- I247.58/586 -->
  92. <li><p>起始索书号</p><span>{{ cellInfo.startSortmark ? cellInfo.startSortmark : '-' }}</span></li>
  93. <li><p>结束索书号</p><span>{{ cellInfo.endSortmark? cellInfo.endSortmark : '-' }}</span></li>
  94. </ul>
  95. <el-button size="mini" class="edit-callNumber" @click="handleEditGridNum">
  96. <!-- <i class="iconfont icon-yulan" /> -->
  97. <!-- <i>&nbsp;&nbsp;&nbsp;</i>
  98. <i>索书号</i> -->
  99. 编辑索书号
  100. </el-button>
  101. </div>
  102. <ul class="layer-handle">
  103. <li>
  104. <p>层位盘点开关</p>
  105. <el-switch
  106. v-model="checkValue"
  107. active-color="#13ce66"
  108. inactive-color="#ff4949"
  109. active-value="true"
  110. inactive-value="false"
  111. @change="changeCheckSwitch"
  112. />
  113. </li>
  114. <li>
  115. <p>图书有序检查</p>
  116. <el-switch
  117. v-model="bookSortValue"
  118. active-color="#13ce66"
  119. inactive-color="#ff4949"
  120. active-value="true"
  121. inactive-value="false"
  122. @change="changeBookSortSwitch"
  123. />
  124. </li>
  125. </ul>
  126. </div>
  127. </div>
  128. </div>
  129. <!-- 编辑索书号 -->
  130. <el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :visible="callNumVisible" title="编辑索书号范围" :before-close="handleClose">
  131. <span class="dialog-right-top" />
  132. <span class="dialog-left-bottom" />
  133. <div class="setting-dialog">
  134. <el-form ref="form" :rules="rules" :model="form" size="small" label-width="100px">
  135. <el-form-item label="所属架位" prop="gridName">
  136. <el-input v-model="form.gridName" disabled style="width: 580px;" />
  137. </el-form-item>
  138. <el-form-item label="起始索书号" prop="startSortmark">
  139. <el-input v-model="form.startSortmark" style="width: 580px;" />
  140. </el-form-item>
  141. <el-form-item label="结束索书号" prop="endSortmark">
  142. <el-input v-model="form.endSortmark" style="width: 580px;" />
  143. </el-form-item>
  144. </el-form>
  145. <div slot="footer" class="dialog-footer">
  146. <el-button type="text" @click.native="handleClose">取消</el-button>
  147. <el-button type="primary" @click.native="handleSaveCallNum">保存</el-button>
  148. </div>
  149. </div>
  150. </el-dialog>
  151. <!-- 查看监控视频 -->
  152. <el-dialog class="view-video" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :visible="hkVideoVisible" title="查看监控视频" :before-close="handleClose">
  153. <span class="dialog-right-top" />
  154. <span class="dialog-left-bottom" />
  155. <div class="setting-dialog">
  156. <hkVideo :hk-config="hkConfig" />
  157. </div>
  158. </el-dialog>
  159. </div>
  160. </template>
  161. <script>
  162. // https://blog.csdn.net/qq_37236395/article/details/119737898
  163. import { FetchInitShelfGridByShelfId, FetcheEditSortmarkByGrid, FetchChangeOrderByGrid, FetchChangeCheckByGrid } from '@/api/shelf/index'
  164. import { FetchDeviceById } from '@/api/deviceVI/index'
  165. import { mapGetters } from 'vuex'
  166. import { swiper, swiperSlide } from 'vue-awesome-swiper'
  167. import 'swiper/dist/css/swiper.css'
  168. import { parseTime, saveAs, getBlob } from '@/utils/index'
  169. import qs from 'qs'
  170. import hkVideo from '@/views/components/hkVideo.vue'
  171. export default {
  172. name: 'BookshelfPosition',
  173. components: { swiper, swiperSlide, hkVideo },
  174. data() {
  175. const _this = this
  176. return {
  177. floorName: null,
  178. regionName: null,
  179. bookShelfDetails: null,
  180. booShelfGrid: null,
  181. cellInfo: {
  182. gridName: null,
  183. startSortmark: null,
  184. endSortmark: null,
  185. cameraId: null
  186. },
  187. callNumVisible: false,
  188. layerNum: 0,
  189. rackNum: 0,
  190. checkValue: 'true',
  191. bookSortValue: 'true',
  192. swiperActiveIndex: 0,
  193. cellIndex: null,
  194. swiperOptionContent: {
  195. slidesPerView: 'auto',
  196. on: {
  197. slideChangeTransitionStart: function() {
  198. _this.cellIndex = null
  199. _this.swiperActiveIndex = this.activeIndex
  200. console.log('activeIndexffff', this.swiperActiveIndex)
  201. _this.swiperTitle.slideTo(this.activeIndex, 500, false)
  202. }
  203. }
  204. },
  205. swiperOptionTitle: {
  206. slidesPerView: 'auto',
  207. freeMode: true
  208. },
  209. tabListData: [],
  210. form: {
  211. id: null,
  212. gridName: null,
  213. startSortmark: null,
  214. endSortmark: null,
  215. check: null,
  216. order: null,
  217. cameraId: null
  218. },
  219. rules: {
  220. gridName: [
  221. { required: true, message: '所属架位不可为空', trigger: 'blur' }
  222. ],
  223. startSortmark: [
  224. { required: true, message: '起始索书号不可为空', trigger: 'blur' }
  225. ],
  226. endSortmark: [
  227. { required: true, message: '结束索书号不可为空', trigger: 'blur' }
  228. ]
  229. },
  230. hkVideoVisible: false,
  231. hkConfig: {
  232. 'username': null,
  233. 'password': null,
  234. 'ip': null,
  235. 'port': null
  236. }
  237. }
  238. },
  239. computed: {
  240. ...mapGetters([
  241. 'user',
  242. 'baseApi'
  243. ]),
  244. swiperContent() {
  245. return this.$refs.swiperContent.$el.swiper
  246. },
  247. swiperTitle() {
  248. return this.$refs.swiperTitle.$el.swiper
  249. },
  250. cellStyle: function() {
  251. // const h = '100%/' + this.layerNum
  252. // const w = '100%/' + this.rackNum
  253. const h = '60px'
  254. const w = '146px'
  255. return { width: `calc(${w} - 4px )`, height: `calc(${h} - 2px)` }
  256. },
  257. rowStyle: function() {
  258. const w = 146 * this.rackNum + 'px'
  259. return { width: `calc(${w})` }
  260. }
  261. },
  262. watch: {
  263. '$route'(val, from) { // 监听到路由(参数)改变
  264. if (this.$route.query) {
  265. this.floorName = this.$route.query.floorName
  266. this.regionName = this.$route.query.regionName
  267. }
  268. }
  269. },
  270. async created() {
  271. if (this.$route.query) {
  272. this.floorName = this.$route.query.floorName
  273. this.regionName = this.$route.query.regionName
  274. }
  275. if (localStorage.getItem('bookShelfDetails')) {
  276. this.bookShelfDetails = JSON.parse(localStorage.getItem('bookShelfDetails'))
  277. this.layerNum = this.bookShelfDetails.shelfFloor
  278. this.rackNum = this.bookShelfDetails.shelfShelf
  279. // 单面/双面
  280. this.tabListData = this.bookShelfDetails.rowType === 1
  281. ? this.bookShelfDetails.toward === 1
  282. ? [{ name: 'A面' }]
  283. : [{ name: 'B面' }]
  284. : [{ name: 'A面' }, { name: 'B面' }]
  285. // 层数据
  286. this.getInitShelfGridByShelfId(this.bookShelfDetails.toward)
  287. }
  288. },
  289. mounted() {
  290. },
  291. methods: {
  292. removeAreaPrefix(gridNames) {
  293. const index = gridNames.indexOf('区')
  294. if (index !== -1) {
  295. return gridNames.substring(index + 1)
  296. }
  297. return gridNames
  298. },
  299. getInitShelfGridByShelfId(toward) {
  300. // rowType 1 单 2 双
  301. // toward 1 A面 2 B面
  302. // shelfType 1 '始终最左边为第1架(S型排架)'
  303. // shelfType 2 'A面最左为第1架(B面最左为最后1架)'
  304. // shelfType 3 'B面最左为第1架(A面最左为最后1架)'
  305. // floorType 1 '最顶层为第一层(从上至下)'
  306. // floorType 2 '最底层为第一层(从下至上)'
  307. FetchInitShelfGridByShelfId({ 'shelfId': this.bookShelfDetails.id, 'toward': toward }).then(res => {
  308. const sortFunction = toward === 1 ? {
  309. 1: { 1: 'sortBookshelvesLeftTop', 2: 'sortBookshelvesLeftBottom' },
  310. 2: { 1: 'sortBookshelvesLeftTop', 2: 'sortBookshelvesLeftBottom' },
  311. 3: { 1: 'sortBookshelvesRightTop', 2: 'sortBookshelvesRightBottom' }
  312. } : {
  313. 1: { 1: 'sortBookshelvesLeftTop', 2: 'sortBookshelvesLeftBottom' },
  314. 2: { 1: 'sortBookshelvesRightTop', 2: 'sortBookshelvesRightBottom' },
  315. 3: { 1: 'sortBookshelvesLeftTop', 2: 'sortBookshelvesLeftBottom' }
  316. }
  317. const shelfType = this.bookShelfDetails.shelfType
  318. const floorType = this.bookShelfDetails.floorType
  319. const sortMethod = sortFunction[shelfType][floorType]
  320. this.booShelfGrid = this[sortMethod](res)
  321. }).catch(() => {
  322. })
  323. },
  324. // 最左为第一架, 最顶层为第一层 从上往下
  325. sortBookshelvesLeftTop(data) {
  326. const sortedData = []
  327. const maxFloor = Math.max(...data.map(item => parseInt(item.gridFloor)))
  328. const maxShelf = Math.max(...data.map(item => parseInt(item.gridShelf.slice(-1))))
  329. for (let i = 1; i <= maxFloor; i++) {
  330. for (let j = 1; j <= maxShelf; j++) {
  331. const currentShelf = data.find(item => parseInt(item.gridFloor) === i && parseInt(item.gridShelf.slice(-1)) === j)
  332. if (currentShelf) {
  333. sortedData.push(currentShelf)
  334. }
  335. }
  336. }
  337. return sortedData
  338. },
  339. // 最右为第一架,最左为最后一架, 最顶层为第一层 从上往下
  340. sortBookshelvesRightTop(data) {
  341. const sortedData = []
  342. // 获取最大的楼层数
  343. const maxFloor = Math.max(...data.map(item => parseInt(item.gridFloor)))
  344. const maxShelf = Math.max(...data.map(item => parseInt(item.gridShelf.match(/\d+$/)[0])))
  345. for (let i = 1; i <= maxFloor; i++) {
  346. // 从最大的书架层数开始,向下排序
  347. for (let j = maxShelf; j >= 1; j--) {
  348. const currentShelf = data.find(item => parseInt(item.gridFloor) === i && parseInt(item.gridShelf.match(/\d+$/)[0]) === j)
  349. if (currentShelf) {
  350. sortedData.push(currentShelf)
  351. }
  352. }
  353. }
  354. return sortedData
  355. },
  356. // 最左为第一架, 最底层为第一层 从下往上
  357. sortBookshelvesLeftBottom(data) {
  358. const sortedData = []
  359. // 获取最大的楼层数
  360. const maxFloor = Math.max(...data.map(item => parseInt(item.gridFloor)))
  361. // 获取最大的书架层数
  362. const maxShelf = Math.max(...data.map(item => parseInt(item.gridShelf.slice(-1))))
  363. for (let i = maxFloor; i >= 1; i--) {
  364. for (let j = 1; j <= maxShelf; j++) {
  365. const currentShelf = data.find(item => parseInt(item.gridFloor) === i && parseInt(item.gridShelf.slice(-1)) === j)
  366. if (currentShelf) {
  367. sortedData.push(currentShelf)
  368. }
  369. }
  370. }
  371. return sortedData
  372. },
  373. // 最左为最后一架, 最底层为第一层 从下往上
  374. sortBookshelvesRightBottom(data) {
  375. const sortedData = []
  376. // 获取最大的楼层数
  377. const maxFloor = Math.max(...data.map(item => parseInt(item.gridFloor)))
  378. const maxShelfPerFloor = data.map(item => parseInt(item.gridShelf.match(/\d+$/)[0]))
  379. .reduce((acc, curr, index, arr) => {
  380. const floor = parseInt(data[index].gridFloor)
  381. if (!acc[floor]) acc[floor] = 1
  382. if (acc[floor] < curr) acc[floor] = curr
  383. return acc
  384. }, {})
  385. // 从最大的楼层开始向下遍历
  386. for (let i = maxFloor; i >= 1; i--) {
  387. // 从最大的书架编号开始向左遍历
  388. for (let j = maxShelfPerFloor[i] || 1; j >= 1; j--) {
  389. const currentShelf = data.find(item => parseInt(item.gridFloor) === i && parseInt(item.gridShelf.match(/\d+$/)[0]) === j)
  390. if (currentShelf) {
  391. sortedData.push(currentShelf)
  392. }
  393. }
  394. }
  395. return sortedData
  396. },
  397. handleSlidClickFun(index) {
  398. this.cellIndex = null
  399. this.handleSlideToFun(index)
  400. if (localStorage.getItem('bookShelfDetails')) {
  401. this.getInitShelfGridByShelfId(index + 1)
  402. }
  403. },
  404. handleSlideToFun(index) {
  405. this.swiperActiveIndex = index
  406. this.swiperContent.slideTo(index, 500, false)
  407. this.swiperTitle.slideTo(index, 500, false)
  408. },
  409. handleCellCurrent(item, index) {
  410. this.cellIndex = index
  411. this.cellInfo = {
  412. id: item.id,
  413. gridName: item.gridName,
  414. startSortmark: item.startSortmark,
  415. endSortmark: item.endSortmark,
  416. cameraId: item.cameraId,
  417. check: item.isCheck,
  418. order: item.isOrder
  419. }
  420. this.checkValue = `${item.isCheck}`
  421. this.bookSortValue = `${item.isOrder}`
  422. },
  423. handleEditGridNum() {
  424. console.log(this.cellIndex)
  425. if (this.cellIndex !== null) {
  426. this.callNumVisible = true
  427. this.form = this.cellInfo
  428. console.log(this.cellInfo)
  429. } else {
  430. this.$message({ message: '请选择需要操作得层位', type: 'error', offset: 8 })
  431. }
  432. },
  433. handleSaveCallNum() {
  434. if (this.$refs['form']) {
  435. this.$refs['form'].validate((valid) => {
  436. if (valid) {
  437. console.log(this.form)
  438. FetcheEditSortmarkByGrid(this.form).then(res => {
  439. console.log(res)
  440. if (res) {
  441. this.$message({ message: '编辑索书号范围成功', type: 'success', offset: 8 })
  442. this.callNumVisible = false
  443. }
  444. }).catch(() => {
  445. })
  446. }
  447. })
  448. }
  449. },
  450. handleClose() {
  451. if (this.callNumVisible) {
  452. this.$refs['form'].resetFields()
  453. this.callNumVisible = false
  454. }
  455. this.hkVideoVisible = false
  456. },
  457. handleViewVideo(data) {
  458. console.log('data', data)
  459. FetchDeviceById({ 'deviceId': data }).then(res => {
  460. if (res) {
  461. console.log(res)
  462. this.hkConfig = {
  463. 'username': res.account,
  464. 'password': res.password,
  465. 'ip': res.ipv4,
  466. 'port': res.rtsp
  467. }
  468. this.hkVideoVisible = true
  469. }
  470. })
  471. },
  472. // 盘点
  473. changeCheckSwitch(data) {
  474. console.log(data)
  475. if (this.cellIndex !== null) {
  476. this.$confirm('此操作将开启/关闭该层位的盘点功能' + '<span>你是否还要继续?</span>', '提示', {
  477. confirmButtonText: '继续',
  478. cancelButtonText: '取消',
  479. type: 'warning',
  480. dangerouslyUseHTMLString: true
  481. }).then(() => {
  482. this.cellInfo.check = JSON.parse(data)
  483. console.log(this.cellInfo)
  484. FetchChangeCheckByGrid(this.cellInfo).then(res => {
  485. this.$message({ message: '修改层位盘点状态成功', type: 'success', offset: 8 })
  486. if (localStorage.getItem('bookShelfDetails')) {
  487. this.getInitShelfGridByShelfId(this.swiperActiveIndex + 1)
  488. }
  489. }).catch(() => {
  490. this.checkValue = data === 'true' ? 'false' : 'true'
  491. })
  492. }).catch(() => {
  493. this.checkValue = data === 'true' ? 'false' : 'true'
  494. })
  495. } else {
  496. this.$message({ message: '请选择需要操作得层位', type: 'error', offset: 8 })
  497. this.checkValue = data === 'true' ? 'false' : 'true'
  498. return false
  499. }
  500. },
  501. changeBookSortSwitch(data) {
  502. console.log(data)
  503. if (this.cellIndex !== null) {
  504. this.$confirm('此操作将开启/关闭该层位的图书顺序检查' + '<span>你是否还要继续?</span>', '提示', {
  505. confirmButtonText: '继续',
  506. cancelButtonText: '取消',
  507. type: 'warning',
  508. dangerouslyUseHTMLString: true
  509. }).then(() => {
  510. this.cellInfo.order = JSON.parse(data)
  511. FetchChangeOrderByGrid(this.cellInfo).then(res => {
  512. this.$message({ message: '修改图书有序检查状态成功', type: 'success', offset: 8 })
  513. if (localStorage.getItem('bookShelfDetails')) {
  514. this.getInitShelfGridByShelfId(this.swiperActiveIndex + 1)
  515. }
  516. }).catch(() => {
  517. this.bookSortValue = data === 'true' ? 'false' : 'true'
  518. })
  519. }).catch(() => {
  520. this.bookSortValue = data === 'true' ? 'false' : 'true'
  521. })
  522. } else {
  523. this.$message({ message: '请选择需要操作得层位', type: 'error', offset: 8 })
  524. this.bookSortValue = data === 'true' ? 'false' : 'true'
  525. return false
  526. }
  527. },
  528. doExport() {
  529. console.log(this.bookShelfDetails)
  530. this.$confirm('此操作将导出所选数据' + '<span>你是否还要继续?</span>', '提示', {
  531. confirmButtonText: '继续',
  532. cancelButtonText: '取消',
  533. type: 'warning',
  534. dangerouslyUseHTMLString: true
  535. }).then(() => {
  536. const params = {
  537. 'shelfId': this.bookShelfDetails.id,
  538. 'toward': this.bookShelfDetails.toward
  539. }
  540. console.log(params)
  541. const fileName = '层位编码-' + parseTime(new Date()) + '.xlsx'
  542. getBlob(this.baseApi + '/api/bookShelf/exportShelfGridLabel' + '?' + qs.stringify(params, { indices: false }), function(blob) {
  543. saveAs(blob, fileName)
  544. })
  545. }).catch(() => {
  546. })
  547. }
  548. }
  549. }
  550. </script>
  551. <style lang="scss" scoped>
  552. .swiper-title{
  553. ::v-deep .swiper-wrapper{
  554. margin: 10px 0;
  555. border-bottom: 1px solid #EDEFF3;
  556. }
  557. }
  558. .swiper-slide-title {
  559. width: auto !important;
  560. margin-right: 20px;
  561. cursor: pointer;
  562. .tab-name {
  563. padding: 10px;
  564. &.active {
  565. color: #0348F3;
  566. border-bottom: 3px solid #0348F3;
  567. }
  568. }
  569. }
  570. .swiper-content{
  571. height: 544px;
  572. }
  573. .swiper-slide-content {
  574. // padding: 0 10px;
  575. // margin: 0 10px 0 0;
  576. }
  577. .view-video{
  578. ::v-deep .el-dialog{
  579. width: 1000px !important;
  580. }
  581. }
  582. .swiper-container{
  583. margin: 0 !important;
  584. }
  585. </style>