MaterialList.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. <!-- by 7527189 2 0 -->
  2. <template>
  3. <a-row :gutter="24">
  4. <a-col :md="24">
  5. <a-card :style="cardStyle" :bordered="false">
  6. <!-- 查询区域 -->
  7. <div class="table-page-search-wrapper">
  8. <!-- 搜索区域 -->
  9. <a-form layout="inline" @keyup.enter.native="searchQuery">
  10. <a-row :gutter="24">
  11. <a-col :md="6" :sm="24">
  12. <a-form-item label="类别" :labelCol="labelCol" :wrapperCol="wrapperCol">
  13. <a-tree-select
  14. style="width: 100%"
  15. :dropdownStyle="{ maxHeight: '200px', overflow: 'auto' }"
  16. allow-clear
  17. :treeData="categoryTree"
  18. v-model="queryParam.categoryId"
  19. placeholder="请选择类别"
  20. >
  21. </a-tree-select>
  22. </a-form-item>
  23. </a-col>
  24. <a-col :md="6" :sm="24">
  25. <a-form-item label="关键词" :labelCol="labelCol" :wrapperCol="wrapperCol">
  26. <a-input placeholder="请输入条码、名称、助记码等查询" v-model="queryParam.materialParam"></a-input>
  27. </a-form-item>
  28. </a-col>
  29. <a-col :md="6" :sm="24">
  30. <a-form-item label="规格" :labelCol="labelCol" :wrapperCol="wrapperCol">
  31. <a-input placeholder="请输入规格查询" v-model="queryParam.standard"></a-input>
  32. </a-form-item>
  33. </a-col>
  34. <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
  35. <a-col :md="6" :sm="24">
  36. <a-button type="primary" @click="searchQuery">查询</a-button>
  37. <a-button style="margin-left: 8px" @click="searchReset">重置</a-button>
  38. <a @click="handleToggleSearch" style="margin-left: 8px">
  39. {{ toggleSearchStatus ? '收起' : '展开' }}
  40. <a-icon :type="toggleSearchStatus ? 'up' : 'down'" />
  41. </a>
  42. </a-col>
  43. </span>
  44. </a-row>
  45. <template v-if="toggleSearchStatus">
  46. <a-row :gutter="24">
  47. <a-col :md="6" :sm="24">
  48. <a-form-item label="型号" :labelCol="labelCol" :wrapperCol="wrapperCol">
  49. <a-input placeholder="请输入型号查询" v-model="queryParam.model"></a-input>
  50. </a-form-item>
  51. </a-col>
  52. <a-col :md="6" :sm="24">
  53. <a-form-item label="颜色" :labelCol="labelCol" :wrapperCol="wrapperCol">
  54. <a-input placeholder="请输入颜色查询" v-model="queryParam.color"></a-input>
  55. </a-form-item>
  56. </a-col>
  57. <a-col :md="6" :sm="24">
  58. <a-form-item label="品牌" :labelCol="labelCol" :wrapperCol="wrapperCol">
  59. <a-input placeholder="请输入品牌查询" v-model="queryParam.brand"></a-input>
  60. </a-form-item>
  61. </a-col>
  62. <!-- <a-col :md="6" :sm="24">
  63. <a-form-item label="制造商" :labelCol="labelCol" :wrapperCol="wrapperCol">
  64. <a-input placeholder="请输入制造商查询" v-model="queryParam.mfrs"></a-input>
  65. </a-form-item>
  66. </a-col> -->
  67. <a-col :md="6" :sm="24">
  68. <a-form-item label="状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
  69. <a-select placeholder="请选择状态" v-model="queryParam.enabled">
  70. <a-select-option value="1">启用</a-select-option>
  71. <a-select-option value="0">禁用</a-select-option>
  72. </a-select>
  73. </a-form-item>
  74. </a-col>
  75. <a-col :md="6" :sm="24">
  76. <a-form-item label="序列号" :labelCol="labelCol" :wrapperCol="wrapperCol">
  77. <a-select placeholder="有无序列号" v-model="queryParam.enableSerialNumber">
  78. <a-select-option value="1">有</a-select-option>
  79. <a-select-option value="0">无</a-select-option>
  80. </a-select>
  81. </a-form-item>
  82. </a-col>
  83. <!-- <a-col :md="6" :sm="24">
  84. <a-form-item label="批号" :labelCol="labelCol" :wrapperCol="wrapperCol">
  85. <a-select placeholder="有无批号" v-model="queryParam.enableBatchNumber">
  86. <a-select-option value="1">有</a-select-option>
  87. <a-select-option value="0">无</a-select-option>
  88. </a-select>
  89. </a-form-item>
  90. </a-col> -->
  91. <!-- <a-col :md="6" :sm="24">
  92. <a-form-item label="仓位货架" :labelCol="labelCol" :wrapperCol="wrapperCol">
  93. <a-input
  94. style="width: 100%"
  95. placeholder="请输入仓位货架查询"
  96. v-model="queryParam.position"
  97. ></a-input>
  98. </a-form-item>
  99. </a-col> -->
  100. <a-col :md="6" :sm="24">
  101. <a-form-item label="扩展信息" :labelCol="labelCol" :wrapperCol="wrapperCol">
  102. <a-input
  103. style="width: 100%"
  104. placeholder="请输入扩展信息查询"
  105. v-model="queryParam.materialOther"
  106. ></a-input>
  107. </a-form-item>
  108. </a-col>
  109. <a-col :md="6" :sm="24">
  110. <a-form-item label="基础重量" :labelCol="labelCol" :wrapperCol="wrapperCol">
  111. <a-input-number
  112. style="width: 100%"
  113. placeholder="请输入基础重量查询"
  114. v-model="queryParam.weight"
  115. ></a-input-number>
  116. </a-form-item>
  117. </a-col>
  118. <!-- <a-col :md="6" :sm="24">
  119. <a-form-item label="保质期" :labelCol="labelCol" :wrapperCol="wrapperCol">
  120. <a-input-number
  121. style="width: 100%"
  122. placeholder="请输入保质期查询"
  123. v-model="queryParam.expiryNum"
  124. ></a-input-number>
  125. </a-form-item>
  126. </a-col> -->
  127. <a-col :md="6" :sm="24">
  128. <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
  129. <a-input placeholder="请输入备注查询" v-model="queryParam.remark"></a-input>
  130. </a-form-item>
  131. </a-col>
  132. </a-row>
  133. </template>
  134. </a-form>
  135. </div>
  136. <!-- 操作按钮区域 -->
  137. <div class="table-operator" style="margin-top: 5px">
  138. <a-button v-if="btnEnableList.indexOf(1) > -1" @click="handleAdd" type="primary" icon="plus">新增</a-button>
  139. <a-button v-if="btnEnableList.indexOf(1) > -1" @click="batchDel" icon="delete">删除</a-button>
  140. <a-button v-if="btnEnableList.indexOf(1) > -1" @click="batchSetStatus(true)" icon="check-square"
  141. >启用</a-button
  142. >
  143. <a-button v-if="btnEnableList.indexOf(1) > -1" @click="batchSetStatus(false)" icon="close-square"
  144. >禁用</a-button
  145. >
  146. <a-button v-if="btnEnableList.indexOf(1) > -1" @click="handleImportXls()" icon="import">导入</a-button>
  147. <a-button v-if="btnEnableList.indexOf(3) > -1" @click="handleExportXls('商品信息')" icon="download"
  148. >导出</a-button
  149. >
  150. <a-button v-if="btnEnableList.indexOf(1) > -1" @click="batchEdit()" icon="edit">批量编辑</a-button>
  151. <a-button v-if="btnEnableList.indexOf(1) > -1" @click="batchSetMaterialCurrentStock()" icon="stock"
  152. >修正库存</a-button
  153. >
  154. <a-button v-if="btnEnableList.indexOf(1) > -1" @click="batchSetMaterialCurrentUnitPrice()" icon="fund"
  155. >修正成本</a-button
  156. >
  157. <a-popover trigger="click" placement="right">
  158. <template slot="content">
  159. <a-checkbox-group @change="onColChange" v-model="settingDataIndex" :defaultValue="settingDataIndex">
  160. <a-row style="width: 500px">
  161. <template v-for="(item, index) in defColumns">
  162. <template>
  163. <a-col :span="8">
  164. <a-checkbox :value="item.dataIndex">
  165. <j-ellipsis :value="item.title" :length="10"></j-ellipsis>
  166. </a-checkbox>
  167. </a-col>
  168. </template>
  169. </template>
  170. </a-row>
  171. <a-row style="padding-top: 10px">
  172. <a-col>
  173. 恢复默认列配置:<a-button @click="handleRestDefault" type="link" size="small">恢复默认</a-button>
  174. </a-col>
  175. </a-row>
  176. </a-checkbox-group>
  177. </template>
  178. <a-button icon="setting">列设置</a-button>
  179. </a-popover>
  180. </div>
  181. <!-- table区域-begin -->
  182. <div>
  183. <a-table
  184. ref="table"
  185. size="middle"
  186. bordered
  187. rowKey="id"
  188. :columns="columns"
  189. :dataSource="dataSource"
  190. :components="handleDrag(columns)"
  191. :pagination="ipagination"
  192. :scroll="scroll"
  193. :loading="loading"
  194. :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange, columnWidth: '40px' }"
  195. @change="handleTableChange"
  196. >
  197. <span slot="action" slot-scope="text, record">
  198. <a @click="handleEdit(record)">编辑</a>
  199. <a-divider v-if="btnEnableList.indexOf(1) > -1" type="vertical" />
  200. <a-popconfirm
  201. v-if="btnEnableList.indexOf(1) > -1"
  202. title="确定删除吗?"
  203. @confirm="() => handleDelete(record.id)"
  204. >
  205. <a>删除</a>
  206. </a-popconfirm>
  207. </span>
  208. <template slot="customPic" slot-scope="text, record">
  209. <a-popover placement="right" trigger="click">
  210. <template slot="content">
  211. <img :src="getImgUrl(record.imgName, record.imgLarge)" width="500px" />
  212. </template>
  213. <div class="item-info" v-if="record.imgName">
  214. <img
  215. v-if="record.imgName"
  216. :src="getImgUrl(record.imgName, record.imgSmall)"
  217. class="item-img"
  218. title="查看大图"
  219. />
  220. </div>
  221. </a-popover>
  222. </template>
  223. <template slot="customBarCode" slot-scope="text, record">
  224. {{ record.mBarCode }}
  225. </template>
  226. <template slot="customName" slot-scope="text, record">
  227. {{ record.name }}
  228. <a-tag v-if="record.enableSerialNumber == 1" color="orange">序</a-tag>
  229. <a-tag v-if="record.enableBatchNumber == 1" color="orange">批</a-tag>
  230. </template>
  231. <template slot="customRenderInitialStock" slot-scope="text, record">
  232. <a-tooltip :title="record.bigUnitInitialStock">
  233. {{ text }}
  234. </a-tooltip>
  235. </template>
  236. <template slot="customRenderStock" slot-scope="text, record">
  237. <a-tooltip :title="record.bigUnitStock">
  238. {{ text }}
  239. </a-tooltip>
  240. </template>
  241. <template slot="customRenderEnabled" slot-scope="enabled">
  242. <a-tag v-if="enabled" color="green">启用</a-tag>
  243. <a-tag v-if="!enabled" color="orange">禁用</a-tag>
  244. </template>
  245. </a-table>
  246. </div>
  247. <!-- table区域-end -->
  248. <!-- 表单区域 -->
  249. <material-modal ref="modalForm" @ok="modalFormOk"></material-modal>
  250. <import-file-modal ref="modalImportForm" @ok="modalFormOk"></import-file-modal>
  251. <batch-set-info-modal ref="batchSetInfoModalForm" @ok="modalFormOk"></batch-set-info-modal>
  252. </a-card>
  253. </a-col>
  254. </a-row>
  255. </template>
  256. <script>
  257. import MaterialModal from './modules/MaterialModal'
  258. import ImportFileModal from '@/components/tools/ImportFileModal'
  259. import BatchSetInfoModal from './modules/BatchSetInfoModal'
  260. import { queryMaterialCategoryTreeList } from '@/api/api'
  261. import { postAction, getFileAccessHttpUrl } from '@/api/manage'
  262. import { getMpListShort } from '@/utils/util'
  263. import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  264. import JEllipsis from '@/components/jeecg/JEllipsis'
  265. import JDate from '@/components/jeecg/JDate'
  266. import Vue from 'vue'
  267. export default {
  268. name: 'MaterialList',
  269. mixins: [JeecgListMixin],
  270. components: {
  271. MaterialModal,
  272. ImportFileModal,
  273. BatchSetInfoModal,
  274. JEllipsis,
  275. JDate,
  276. },
  277. data() {
  278. return {
  279. categoryTree: [],
  280. mPropertyListShort: '',
  281. model: {},
  282. labelCol: {
  283. span: 5,
  284. },
  285. wrapperCol: {
  286. span: 18,
  287. offset: 1,
  288. },
  289. // 查询条件
  290. queryParam: {
  291. categoryId: undefined,
  292. materialParam: '',
  293. standard: '',
  294. model: '',
  295. color: '',
  296. brand: '',
  297. mfrs: '',
  298. materialOther: '',
  299. weight: '',
  300. expiryNum: '',
  301. enabled: undefined,
  302. enableSerialNumber: undefined,
  303. enableBatchNumber: undefined,
  304. position: '',
  305. remark: '',
  306. mpList: getMpListShort(Vue.ls.get('materialPropertyList')), //扩展属性
  307. },
  308. ipagination: {
  309. pageSizeOptions: ['10', '20', '30', '50', '100', '200'],
  310. },
  311. // 实际索引
  312. settingDataIndex: [],
  313. // 实际列
  314. columns: [],
  315. // 默认索引
  316. defDataIndex: [
  317. 'action',
  318. 'mBarCode',
  319. 'name',
  320. 'standard',
  321. 'model',
  322. 'color',
  323. 'categoryName',
  324. 'materialOther',
  325. 'unit',
  326. 'stock',
  327. 'purchaseDecimal',
  328. 'commodityDecimal',
  329. 'wholesaleDecimal',
  330. 'lowDecimal',
  331. 'enabled',
  332. ],
  333. // 默认列
  334. defColumns: [
  335. {
  336. title: '操作',
  337. dataIndex: 'action',
  338. align: 'center',
  339. width: 100,
  340. scopedSlots: { customRender: 'action' },
  341. },
  342. { title: '图片', dataIndex: 'pic', width: 60, scopedSlots: { customRender: 'customPic' } },
  343. { title: '条码', dataIndex: 'mBarCode', width: 120 },
  344. { title: '名称', dataIndex: 'name', width: 160, scopedSlots: { customRender: 'customName' } },
  345. { title: '规格', dataIndex: 'standard', width: 120 },
  346. { title: '型号', dataIndex: 'model', width: 120 },
  347. { title: '颜色', dataIndex: 'color', width: 70, ellipsis: true },
  348. { title: '品牌', dataIndex: 'brand', width: 100, ellipsis: true },
  349. { title: '助记码', dataIndex: 'mnemonic', width: 80, ellipsis: true },
  350. { title: '类别', dataIndex: 'categoryName', width: 100, ellipsis: true },
  351. { title: '扩展信息', dataIndex: 'materialOther', width: 100, ellipsis: true },
  352. {
  353. title: '单位',
  354. dataIndex: 'unit',
  355. width: 100,
  356. ellipsis: true,
  357. customRender: function (t, r, index) {
  358. if (r) {
  359. let name = t ? t : r.unitName
  360. if (r.sku) {
  361. return name + '[SKU]'
  362. } else {
  363. return name
  364. }
  365. }
  366. },
  367. },
  368. { title: '基础重量', dataIndex: 'weight', width: 80 },
  369. { title: '保质期', dataIndex: 'expiryNum', width: 60 },
  370. { title: '制造商', dataIndex: 'mfrs', width: 120, ellipsis: true },
  371. {
  372. title: '初始库存',
  373. dataIndex: 'initialStock',
  374. width: 80,
  375. scopedSlots: { customRender: 'customRenderInitialStock' },
  376. },
  377. { title: '库存', dataIndex: 'stock', width: 80, scopedSlots: { customRender: 'customRenderStock' } },
  378. { title: '采购价', dataIndex: 'purchaseDecimal', width: 80 },
  379. { title: '零售价', dataIndex: 'commodityDecimal', width: 80 },
  380. { title: '销售价', dataIndex: 'wholesaleDecimal', width: 80 },
  381. { title: '最低售价', dataIndex: 'lowDecimal', width: 80 },
  382. { title: '仓位货架', dataIndex: 'position', width: 80 },
  383. { title: '备注', dataIndex: 'remark', width: 80 },
  384. {
  385. title: '状态',
  386. dataIndex: 'enabled',
  387. align: 'center',
  388. width: 60,
  389. scopedSlots: { customRender: 'customRenderEnabled' },
  390. },
  391. ],
  392. url: {
  393. list: '/material/list',
  394. delete: '/material/delete',
  395. deleteBatch: '/material/deleteBatch',
  396. importExcelUrl: '/material/importExcel',
  397. exportXlsUrl: '/material/exportExcel',
  398. batchSetStatusUrl: '/material/batchSetStatus',
  399. batchSetMaterialCurrentStockUrl: '/material/batchSetMaterialCurrentStock',
  400. batchSetMaterialCurrentUnitPriceUrl: '/material/batchSetMaterialCurrentUnitPrice',
  401. },
  402. }
  403. },
  404. created() {
  405. this.model = Object.assign({}, {})
  406. this.initColumnsSetting()
  407. this.loadTreeData()
  408. },
  409. computed: {
  410. importExcelUrl: function () {
  411. return `${window._CONFIG['domianURL']}${this.url.importExcelUrl}`
  412. },
  413. },
  414. methods: {
  415. //加载初始化列
  416. initColumnsSetting() {
  417. let columnsStr = Vue.ls.get('materialColumns')
  418. if (columnsStr && columnsStr.indexOf(',') > -1) {
  419. this.settingDataIndex = columnsStr.split(',')
  420. } else {
  421. this.settingDataIndex = this.defDataIndex
  422. }
  423. this.columns = this.defColumns.filter((item) => {
  424. return this.settingDataIndex.includes(item.dataIndex)
  425. })
  426. },
  427. //列设置更改事件
  428. onColChange(checkedValues) {
  429. this.columns = this.defColumns.filter((item) => {
  430. return checkedValues.includes(item.dataIndex)
  431. })
  432. let columnsStr = checkedValues.join()
  433. Vue.ls.set('materialColumns', columnsStr)
  434. },
  435. //恢复默认
  436. handleRestDefault() {
  437. Vue.ls.remove('materialColumns')
  438. this.initColumnsSetting()
  439. },
  440. loadTreeData() {
  441. let that = this
  442. let params = {}
  443. params.id = ''
  444. queryMaterialCategoryTreeList(params).then((res) => {
  445. if (res) {
  446. that.categoryTree = []
  447. for (let i = 0; i < res.length; i++) {
  448. let temp = res[i]
  449. that.categoryTree.push(temp)
  450. }
  451. }
  452. })
  453. },
  454. batchSetMaterialCurrentStock() {
  455. if (this.selectedRowKeys.length <= 0) {
  456. this.$message.warning('请选择一条记录!')
  457. } else {
  458. let ids = ''
  459. for (let a = 0; a < this.selectedRowKeys.length; a++) {
  460. ids += this.selectedRowKeys[a] + ','
  461. }
  462. let that = this
  463. this.$confirm({
  464. title: '确认操作',
  465. content: '是否操作选中数据?',
  466. onOk: function () {
  467. that.loading = true
  468. postAction(that.url.batchSetMaterialCurrentStockUrl, { ids: ids })
  469. .then((res) => {
  470. if (res.code === 200) {
  471. that.$message.info('修正库存成功!')
  472. that.loadData()
  473. that.onClearSelected()
  474. } else {
  475. that.$message.warning(res.data.message)
  476. }
  477. })
  478. .finally(() => {
  479. that.loading = false
  480. })
  481. },
  482. })
  483. }
  484. },
  485. batchSetMaterialCurrentUnitPrice() {
  486. if (this.selectedRowKeys.length <= 0) {
  487. this.$message.warning('请选择一条记录!')
  488. } else {
  489. let ids = ''
  490. for (let a = 0; a < this.selectedRowKeys.length; a++) {
  491. ids += this.selectedRowKeys[a] + ','
  492. }
  493. let that = this
  494. this.$confirm({
  495. title: '确认操作',
  496. content: '是否操作选中数据?',
  497. onOk: function () {
  498. that.loading = true
  499. postAction(that.url.batchSetMaterialCurrentUnitPriceUrl, { ids: ids })
  500. .then((res) => {
  501. if (res.code === 200) {
  502. that.$message.info('修正成本成功!')
  503. that.loadData()
  504. that.onClearSelected()
  505. } else {
  506. that.$message.warning(res.data.message)
  507. }
  508. })
  509. .finally(() => {
  510. that.loading = false
  511. })
  512. },
  513. })
  514. }
  515. },
  516. batchEdit() {
  517. if (this.selectedRowKeys.length <= 0) {
  518. this.$message.warning('请选择一条记录!')
  519. } else {
  520. let ids = ''
  521. for (let a = 0; a < this.selectedRowKeys.length; a++) {
  522. if (a === this.selectedRowKeys.length - 1) {
  523. ids += this.selectedRowKeys[a]
  524. } else {
  525. ids += this.selectedRowKeys[a] + ','
  526. }
  527. }
  528. this.$refs.batchSetInfoModalForm.edit(ids)
  529. this.$refs.batchSetInfoModalForm.title = '批量编辑'
  530. }
  531. },
  532. handleEdit: function (record) {
  533. this.$refs.modalForm.edit(record)
  534. this.$refs.modalForm.title = '编辑'
  535. this.$refs.modalForm.disableSubmit = false
  536. if (this.btnEnableList.indexOf(1) === -1) {
  537. this.$refs.modalForm.showOkFlag = false
  538. }
  539. },
  540. getImgUrl(imgName, type) {
  541. if (imgName && imgName.split(',')) {
  542. type = type ? type + '/' : ''
  543. return getFileAccessHttpUrl('systemConfig/static/' + type + imgName.split(',')[0])
  544. } else {
  545. return ''
  546. }
  547. },
  548. handleImportXls() {
  549. let importExcelUrl = this.url.importExcelUrl
  550. let templateUrl = '/doc/goods_template.xls'
  551. let templateName = '商品Excel模板[下载]'
  552. this.$refs.modalImportForm.initModal(importExcelUrl, templateUrl, templateName)
  553. this.$refs.modalImportForm.title = '商品导入'
  554. },
  555. searchReset() {
  556. this.queryParam = {
  557. mpList: getMpListShort(Vue.ls.get('materialPropertyList')), //扩展属性
  558. }
  559. this.loadData(1)
  560. },
  561. },
  562. }
  563. </script>
  564. <style scoped>
  565. @import '~@assets/less/common.less';
  566. </style>
  567. <style>
  568. .item-info {
  569. float: left;
  570. width: 38px;
  571. height: 38px;
  572. margin-left: 6px;
  573. }
  574. .item-img {
  575. cursor: pointer;
  576. position: static;
  577. display: block;
  578. width: 100%;
  579. height: 100%;
  580. object-fit: cover;
  581. }
  582. </style>