无线电资产管理
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.

694 lines
25 KiB

3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
  1. <template>
  2. <div class="app-container row-container">
  3. <!--工具栏-->
  4. <div class="head-container">
  5. <div v-if="crud.props.searchToggle" class="head-search">
  6. <!-- 搜索 -->
  7. <el-input v-model="query.search" size="small" clearable placeholder="输入资产名称/编码搜索" prefix-icon="el-icon-search" style="width: 220px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
  8. <rrOperation />
  9. </div>
  10. <crudOperation :permission="permission">
  11. <template v-slot:left>
  12. <el-button size="mini" @click="toAdd()">
  13. <i class="iconfont icon-xinzeng" />
  14. 新增
  15. </el-button>
  16. <el-button slot="reference" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="toDelete(crud.selections)">
  17. <i class="iconfont icon-shanchu" />
  18. 删除
  19. </el-button>
  20. </template>
  21. </crudOperation>
  22. </div>
  23. <div class="container-wrap">
  24. <span class="right-top-line" />
  25. <span class="left-bottom-line" />
  26. <el-table ref="table" v-loading="crud.loading" :header-cell-class-name="headerCellClassName" :cell-class-name="cellClassName" highlight-current-row style="width: 100%;" height="calc(100vh - 330px)" :data="crud.data" @row-dblclick="handleRowDblClick" @selection-change="crud.selectionChangeHandler">
  27. <el-table-column type="selection" width="55" align="center" />
  28. <el-table-column prop="mark" label="资产编号" min-width="180px" :show-overflow-tooltip="true" />
  29. <el-table-column prop="name" label="资产名称" min-width="180px" :show-overflow-tooltip="true" />
  30. <el-table-column prop="capitaltyepname" label="资产类型" width="80px" :show-overflow-tooltip="true" />
  31. <el-table-column prop="startprice" label="价值" width="80px" align="right" :show-overflow-tooltip="true" :formatter="(row) => formatMoney(row.startprice)" />
  32. <el-table-column prop="unitname" label="计量单位" width="80px" align="center" :show-overflow-tooltip="true" />
  33. <el-table-column prop="departmentname" label="使用部门" :show-overflow-tooltip="true" />
  34. <el-table-column prop="resourcename" label="使用人" :show-overflow-tooltip="true" />
  35. <el-table-column prop="blongdepartmentname" label="所属部门" min-width="140px" :show-overflow-tooltip="true" />
  36. <el-table-column prop="glrname" label="管理人" :show-overflow-tooltip="true" />
  37. <el-table-column prop="cfdname" label="存放地" min-width="140px" :show-overflow-tooltip="true" />
  38. <el-table-column prop="whiteCreateTime" label="加入时间" width="180px">
  39. <template slot-scope="scope">
  40. <div>{{ scope.row.whiteCreateTime | parseTime }}</div>
  41. </template>
  42. </el-table-column>
  43. <el-table-column prop="whiteLastname" label="操作人">
  44. <template slot-scope="scope">
  45. <div>{{ scope.row.whiteLastname || '——' }}</div>
  46. </template>
  47. </el-table-column>
  48. <el-table-column prop="whiteRemark" label="备注" :show-overflow-tooltip="true">
  49. <template slot-scope="scope">
  50. <div>{{ scope.row.whiteRemark || '——' }}</div>
  51. </template>
  52. </el-table-column>
  53. </el-table>
  54. <!--分页组件-->
  55. <pagination v-if="crud.data.length!==0" />
  56. </div>
  57. <!-- 资产详情弹窗 -->
  58. <el-dialog class="detailBook" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="handleCloseDialog" :visible="detailDialogVisible" title="资产详情">
  59. <span class="dialog-right-top" />
  60. <span class="dialog-left-bottom" />
  61. <div class="setting-dialog">
  62. <div class="detail-tab tab-content">
  63. <div class="detail-check">
  64. <div style="flex: 1;">
  65. <ul class="book-detail asset-detail" style="max-height: 680px; overflow: auto;">
  66. <li><span>资产编号</span>{{ selectedAsset && selectedAsset.mark }}</li>
  67. <li><span>资产名称</span>{{ selectedAsset && selectedAsset.name }}</li>
  68. <li><span>资产类型</span>{{ selectedAsset && selectedAsset.capitaltyepname || '——' }}</li>
  69. <li><span>规格型号</span>{{ selectedAsset && selectedAsset.capitalspec || '——' }}</li>
  70. <!-- <li><span>设备用途</span>{{ selectedAsset && selectedAsset.sbyt || '——' }}</li> -->
  71. <li><span>价值类型</span>{{ selectedAsset && selectedAsset.jzlx || '——' }}</li>
  72. <li><span>价值</span>{{ selectedAsset ? formatMoney(selectedAsset?.startprice) : '——' }}</li>
  73. <li><span>数量</span>{{ selectedAsset && selectedAsset.capitalnum }}</li>
  74. <li><span>实际数量</span>{{ selectedAsset && selectedAsset.sjsl }}</li>
  75. <li><span>计量单位</span>{{ selectedAsset && selectedAsset.unitname }}</li>
  76. <li><span>使用部门</span>{{ selectedAsset && selectedAsset.departmentname }}</li>
  77. <li><span>使用人</span>{{ selectedAsset && selectedAsset.resourcename }}</li>
  78. <li><span>所属部门</span>{{ selectedAsset && selectedAsset.blongdepartmentname }}</li>
  79. <li><span>管理人</span>{{ selectedAsset && selectedAsset.glrname }}</li>
  80. <li><span>存放地</span>{{ selectedAsset && selectedAsset.cfdname }}</li>
  81. <li><span>供应商</span>{{ selectedAsset && selectedAsset.gys }}</li>
  82. <li><span>项目名称</span>{{ selectedAsset && selectedAsset.xmmc }}</li>
  83. <!-- <li><span>无线电设备用途</span>{{ selectedAsset && selectedAsset.wxdsbyt }}</li> -->
  84. <li><span>领用日期</span>{{ selectedAsset && selectedAsset.deprestartdate | parseTime }}</li>
  85. <li><span>投入使用日期</span>{{ selectedAsset && selectedAsset.trsyrq | parseTime }}</li>
  86. <li><span>入账日期</span>{{ selectedAsset && selectedAsset.rzrq | parseTime }}</li>
  87. <li><span>保修截至日期</span>{{ selectedAsset && selectedAsset.bxjzrq | parseTime }}</li>
  88. </ul>
  89. <div class="book-detail white-detail">
  90. <div class="white-title">
  91. <span class="small-line" />
  92. <p>已加入白名单</p>
  93. <span class="big-line" />
  94. </div>
  95. <ul>
  96. <li class="white-item"><span>加入时间</span>{{ selectedAsset && selectedAsset.whiteCreateTime | parseTime }}</li>
  97. <li class="white-item"><span>操作人</span>{{ selectedAsset && selectedAsset.whiteLastname || '——' }}</li>
  98. <li class="white-item"><span>备注</span>{{ selectedAsset && selectedAsset.whiteRemark || '——' }}</li>
  99. </ul>
  100. </div>
  101. </div>
  102. <!-- 资产图片列表竖向滚动 + 删除按钮 -->
  103. <div class="asset-image-wrapper">
  104. <div v-if="assetImageList.length > 0" class="asset-image-scroll">
  105. <div v-for="(item, index) in assetImageList" :key="item.id || index" class="image-item">
  106. <el-image
  107. class="preview-img"
  108. :src="item.imgUrl"
  109. fit="contain"
  110. :preview-src-list="assetImageList.map(img => img.imgUrl)"
  111. :preview-initial-index="index"
  112. />
  113. </div>
  114. </div>
  115. <div v-else class="default-img">
  116. <img :src="require('@/assets/images/system/default-img2.png')" alt="默认图片">
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. </el-dialog>
  123. <el-dialog
  124. title="新增资产白名单"
  125. :visible.sync="addDialogVisible"
  126. width="1000px"
  127. append-to-body
  128. :close-on-click-modal="false"
  129. @close="resetAddDialog"
  130. >
  131. <div style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 20px;">
  132. <div>
  133. <el-input v-model="addSearch" size="small" clearable placeholder="输入资产名称/编码搜索" prefix-icon="el-icon-search" style="width: 220px;" class="filter-item" @keyup.enter.native="toQuery" @clear="toQuery" />
  134. <el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search" @click="toQuery">搜索</el-button>
  135. </div>
  136. <div style="color:#606266;">
  137. 已选择资产<span style="color:#409EFF">{{ selectedMarkSet.size }}</span>
  138. </div>
  139. </div>
  140. <div v-loading="addDialogLoading">
  141. <el-table ref="addTable" :row-key="row => row.mark" :data="initAssetList" height="446px" @selection-change="handleSelectionChange">
  142. <el-table-column type="selection" width="55" :reserve-selection="true" />
  143. <el-table-column prop="mark" label="资产编号" min-width="200px" :show-overflow-tooltip="true" />
  144. <el-table-column prop="name" label="资产名称" min-width="200px" :show-overflow-tooltip="true" />
  145. <el-table-column prop="capitaltyepname" label="资产类型" width="80px" :show-overflow-tooltip="true" />
  146. <el-table-column prop="startprice" label="价值" width="80px" align="right" :show-overflow-tooltip="true" :formatter="(row) => formatMoney(row.startprice)" />
  147. <el-table-column prop="unitname" label="计量单位" width="80px" align="center" :show-overflow-tooltip="true" />
  148. <el-table-column prop="departmentname" label="使用部门" :show-overflow-tooltip="true" />
  149. <el-table-column prop="resourcename" label="使用人" :show-overflow-tooltip="true" />
  150. <el-table-column prop="blongdepartmentname" label="所属部门" min-width="140px" :show-overflow-tooltip="true" />
  151. <el-table-column prop="glrname" label="管理人" :show-overflow-tooltip="true" />
  152. <el-table-column prop="cfdname" label="存放地" min-width="140px" :show-overflow-tooltip="true" />
  153. <el-table-column prop="is_whitelist" label="是否白名单" width="90px" align="center" fixed="right">
  154. <template slot-scope="scope">
  155. <el-tag v-if="scope.row.is_whitelist" type="success">白名单</el-tag>
  156. <span v-else>-</span>
  157. </template>
  158. </el-table-column>
  159. </el-table>
  160. <!-- 弹窗内分页 -->
  161. <el-pagination
  162. :current-page="addPage.pageNo"
  163. :page-sizes="[10, 20, 50, 100]"
  164. :page-size="addPage.pageSize"
  165. layout="total, sizes, prev, pager, next"
  166. :total="addPage.total"
  167. style="margin: 20px 0 !important;"
  168. @size-change="onAddSizeChange"
  169. @current-change="onAddPageChange"
  170. />
  171. <div style="padding: 20px 20px 0 20px;">
  172. <el-form ref="form" inline :model="addForm" size="small" label-width="40px">
  173. <el-form-item label="备注" prop="remark" style="margin-bottom: 0 !important;">
  174. <el-input v-model="addForm.remark" type="textarea" rows="3" placeholder="请输入备注" style="width: 880px;" />
  175. </el-form-item>
  176. </el-form>
  177. </div>
  178. </div>
  179. <span slot="footer" class="dialog-footer">
  180. <el-button @click="addDialogVisible = false">取消</el-button>
  181. <el-button type="primary" :loading="submitLoading" @click="submitAdd">确定</el-button>
  182. </span>
  183. </el-dialog>
  184. </div>
  185. </template>
  186. <script>
  187. import crudAsset, { FetchAssetInfoDetailsByMark, FetchInitAssetInfo, FetchAddAssetWhiteList, FetchDeleteAssetWhiteList } from '@/api/asset/index'
  188. import CRUD, { presenter, header, crud } from '@crud/crud'
  189. import rrOperation from '@crud/RR.operation'
  190. import crudOperation from '@crud/CRUD.operation'
  191. import pagination from '@crud/Pagination'
  192. import { mapGetters } from 'vuex'
  193. // import { addAssetWhitelist } from '@/api/asset/index' // 真实新增接口
  194. export default {
  195. name: 'AssetWhitelist',
  196. components: { pagination, crudOperation, rrOperation },
  197. cruds() {
  198. return CRUD({ title: '资产白名单', idField: 'mark', url: 'api/asset/initAssetInfo', crudMethod: { ...crudAsset }, optShow: {
  199. add: false,
  200. edit: false,
  201. del: false,
  202. reset: true,
  203. download: false,
  204. group: false
  205. }})
  206. },
  207. mixins: [presenter(), header(), crud()],
  208. data() {
  209. return {
  210. permission: { add: [], edit: [], del: [] },
  211. selectedFile: null,
  212. detailDialogVisible: false,
  213. selectedAsset: null,
  214. assetImageList: [],
  215. addDialogVisible: false,
  216. addDialogLoading: false,
  217. submitLoading: false,
  218. initAssetList: [], // 弹窗内待选资产列表
  219. selectedMarkSet: new Map(), // 跨页保存勾选行:mark -> row(由 reserve-selection 自动维护)
  220. addForm: {
  221. remark: ''
  222. },
  223. // 弹窗内部分页
  224. addPage: {
  225. pageNo: 1,
  226. pageSize: 10,
  227. total: 0
  228. },
  229. addSearch: ''
  230. }
  231. },
  232. computed: {
  233. ...mapGetters([
  234. 'baseApi',
  235. 'user'
  236. ])
  237. },
  238. created() {
  239. },
  240. mounted() {
  241. },
  242. methods: {
  243. // 数据单元格样式
  244. cellClassName({ row, column, rowIndex, columnIndex }) {
  245. const whiteFields = ['whiteCreateTime', 'whiteLastname', 'whiteRemark']
  246. if (whiteFields.includes(column.property)) {
  247. return 'white-list-cell'
  248. }
  249. return ''
  250. },
  251. // 表头单元格样式
  252. headerCellClassName({ row, column, rowIndex, columnIndex }) {
  253. const whiteFields = ['whiteCreateTime', 'whiteLastname', 'whiteRemark']
  254. if (whiteFields.includes(column.property)) {
  255. return 'white-list-header-cell'
  256. }
  257. return ''
  258. },
  259. [CRUD.HOOK.beforeRefresh]() {
  260. if (this.crud.query.search) {
  261. this.crud.query.search = this.crud.query.search.trim()
  262. }
  263. this.crud.params.isWhite = true
  264. // 保存原始参数
  265. this.originalPage = this.crud.page.page
  266. this.originalSize = this.crud.page.size
  267. // 添加pageNo和pageSize参数
  268. this.crud.params.pageNo = this.crud.page.page
  269. this.crud.params.pageSize = this.crud.page.size
  270. // 清空page和size参数
  271. this.crud.params.page = undefined
  272. this.crud.params.size = undefined
  273. },
  274. [CRUD.HOOK.afterRefresh](crud) {
  275. // 恢复原始参数
  276. if (this.originalPage !== undefined) {
  277. this.crud.page.page = this.originalPage
  278. this.crud.page.size = this.originalSize
  279. // 移除pageNo和pageSize参数
  280. delete this.crud.params.pageNo
  281. delete this.crud.params.pageSize
  282. delete this.crud.params.page
  283. delete this.crud.params.size
  284. }
  285. console.log(crud.data)
  286. },
  287. // 新增前
  288. [CRUD.HOOK.beforeToAdd](crud, form) {
  289. },
  290. // 编辑前
  291. [CRUD.HOOK.beforeToEdit](crud, form) {
  292. },
  293. // 提交前做的操作
  294. [CRUD.HOOK.afterValidateCU](crud) {
  295. return true
  296. },
  297. formatMoney(money) {
  298. if (!money && money !== 0) return '——'
  299. return Number(money).toLocaleString('en-US')
  300. },
  301. // 处理行双击事件
  302. // 处理行双击事件
  303. handleRowDblClick(row) {
  304. this.detailDialogVisible = true
  305. this.selectedAsset = {}
  306. this.assetImageList = []
  307. const params = { mark: row.mark }
  308. FetchAssetInfoDetailsByMark(params).then(res => {
  309. // 合并详情接口数据 + 列表行的白名单字段
  310. this.selectedAsset = {
  311. ...(res || {}),
  312. capitaltyepname: row.capitaltyepname,
  313. resourcename: row.resourcename,
  314. whiteCreateTime: row.whiteCreateTime,
  315. whiteLastname: row.whiteLastname,
  316. whiteRemark: row.whiteRemark
  317. }
  318. const photoList = res?.assetInfoPhoto || []
  319. this.assetImageList = photoList.map(item => ({
  320. id: item.id,
  321. photoUrl: item.photoUrl,
  322. imgUrl: this.baseApi + '/api/minio/getImg?bucket=2&fileName=' + item.photoUrl
  323. }))
  324. })
  325. },
  326. handleCloseDialog() {
  327. this.detailDialogVisible = false
  328. this.selectedAsset = null
  329. this.assetImageList = []
  330. },
  331. toAdd() {
  332. this.addDialogVisible = true
  333. this.addPage.pageNo = 1
  334. this.addPage.pageSize = 10
  335. this.addPage.total = 0
  336. this.selectedMarkSet.clear()
  337. // 清空表格保留的跨页选中状态
  338. this.$nextTick(() => {
  339. this.$refs.addTable && this.$refs.addTable.clearSelection()
  340. })
  341. this.addForm.remark = ''
  342. this.loadInitAssetList()
  343. },
  344. toQuery() {
  345. this.addPage.pageNo = 1
  346. this.addPage.pageSize = 10
  347. this.addPage.total = 0
  348. this.loadInitAssetList()
  349. },
  350. // 加载弹窗表格
  351. async loadInitAssetList() {
  352. this.addDialogLoading = true
  353. try {
  354. const res = await FetchInitAssetInfo({
  355. search: this.addSearch.trim(),
  356. pageNo: this.addPage.pageNo,
  357. pageSize: this.addPage.pageSize
  358. })
  359. this.initAssetList = res.records || []
  360. this.addPage.total = res.total || 0
  361. // reserve-selection 会自动回显已勾选行,无需手动处理
  362. } catch (e) {
  363. this.$message.error('加载失败')
  364. } finally {
  365. this.addDialogLoading = false
  366. }
  367. },
  368. handleSelectionChange(rows) {
  369. // rows 为当前所有跨页选中行
  370. this.selectedMarkSet = new Map(rows.map(row => [row.mark, row]))
  371. console.log('当前全部选中mark集合:', Array.from(this.selectedMarkSet.keys()))
  372. },
  373. // 分页切换
  374. onAddPageChange(val) {
  375. this.addPage.pageNo = val
  376. this.loadInitAssetList()
  377. },
  378. onAddSizeChange(val) {
  379. this.addPage.pageSize = val
  380. this.addPage.pageNo = 1
  381. this.loadInitAssetList()
  382. },
  383. // 提交新增白名单
  384. async submitAdd() {
  385. const selectedRows = Array.from(this.selectedMarkSet.values())
  386. console.log('最终选中的全部行:', selectedRows)
  387. if (selectedRows.length === 0) {
  388. return this.$message.warning('请至少选择一条资产')
  389. }
  390. this.submitLoading = true
  391. try {
  392. const params = {
  393. assetInfos: selectedRows.map(row => ({ mark: row.mark, epc: row.epc })),
  394. createBy: this.user.id,
  395. remark: this.addForm.remark
  396. }
  397. console.log('params', params)
  398. await FetchAddAssetWhiteList(params).then(res => {
  399. console.log('FetchAddAssetWhiteList', res)
  400. if (res.code !== null) {
  401. this.$message.success(res || '加入白名单成功')
  402. this.addDialogVisible = false
  403. this.crud.refresh()
  404. } else {
  405. this.$message.error(res.message || '加入白名单失败')
  406. }
  407. }).catch(err => {
  408. this.$message.error(err.message || '加入白名单失败')
  409. })
  410. } catch (err) {
  411. this.$message.error(err.message || '加入白名单失败')
  412. } finally {
  413. this.submitLoading = false
  414. }
  415. },
  416. // 关闭弹窗重置状态
  417. resetAddDialog() {
  418. this.initAssetList = []
  419. this.selectedMarkSet.clear()
  420. this.addForm.remark = ''
  421. this.addPage.pageNo = 1
  422. this.addPage.total = 0
  423. this.addSearch = ''
  424. this.$nextTick(() => {
  425. this.$refs.addTable && this.$refs.addTable.clearSelection()
  426. })
  427. },
  428. toDelete(datas) {
  429. console.log('toDelete', datas)
  430. this.$confirm('此操作将删除当前所选' + this.crud.title + '<span>你是否还要继续?</span>', '提示', {
  431. confirmButtonText: '继续',
  432. cancelButtonText: '取消',
  433. type: 'warning',
  434. dangerouslyUseHTMLString: true
  435. }).then(() => {
  436. this.crud.delAllLoading = true
  437. const marks = datas.map(val => val.mark)
  438. console.log('marks', marks)
  439. FetchDeleteAssetWhiteList(marks).then(res => {
  440. console.log('FetchDeleteAssetWhiteList', res)
  441. if (res.code !== null) {
  442. this.$message({ message: res, type: 'success', offset: 8 })
  443. this.crud.delAllLoading = false
  444. this.crud.refresh()
  445. } else {
  446. this.$message.error(res.message || '删除失败')
  447. }
  448. }).catch(err => {
  449. this.crud.delAllLoading = false
  450. console.log(err)
  451. })
  452. }).catch(() => {
  453. })
  454. }
  455. }
  456. }
  457. </script>
  458. <style lang="scss" scoped>
  459. .sync-loading {
  460. display: flex;
  461. justify-content: center;
  462. align-items: center;
  463. min-height: 200px;
  464. }
  465. .sync-loading-content {
  466. text-align: center;
  467. }
  468. .sync-loading-icon {
  469. font-size: 48px;
  470. color: #409EFF;
  471. }
  472. .sync-status {
  473. margin-top: 15px;
  474. text-align: center;
  475. color: #606266;
  476. font-size: 14px;
  477. }
  478. .file-tip {
  479. margin-left: 10px;
  480. font-size: 12px;
  481. color: #606266;
  482. }
  483. .sync-result{
  484. display: flex;
  485. justify-content: center;
  486. align-items: center;
  487. margin-top: 40px;
  488. font-size: 22px;
  489. text-align: center;
  490. .sync-text{
  491. margin-left: 10px;
  492. p{
  493. display: inline-block;
  494. span{
  495. display: inline-block;
  496. padding: 0 4px;
  497. }
  498. }
  499. }
  500. }
  501. ::v-deep .el-dialog__footer{
  502. padding: 0 0 20px 0 !important;
  503. }
  504. .asset-detail-content {
  505. display: flex;
  506. gap: 20px;
  507. }
  508. .asset-info {
  509. flex: 1;
  510. }
  511. // 资产图片列表样式(竖向滚动)
  512. .asset-image-wrapper {
  513. width: 400px;
  514. height: 660px; /* 固定高度 */
  515. overflow: hidden;
  516. }
  517. .asset-image-scroll {
  518. width: 100%;
  519. height: 100%;
  520. overflow-y: auto; /* 竖向滚动条 */
  521. padding-right: 5px;
  522. display: flex;
  523. flex-direction: column;
  524. gap: 10px;
  525. }
  526. .image-item {
  527. position: relative;
  528. width: 100%;
  529. height: 150px;
  530. background: #f5f7fa;
  531. border-radius: 4px;
  532. overflow: hidden;
  533. flex-shrink: 0;
  534. }
  535. .preview-img {
  536. width: 100%;
  537. height: 100%;
  538. object-fit: contain;
  539. background: #fff;
  540. }
  541. // 删除按钮
  542. .delete-btn {
  543. position: absolute;
  544. top: 5px;
  545. right: 5px;
  546. width: 22px;
  547. height: 22px;
  548. background: rgba(0, 0, 0, 0.6);
  549. color: #fff;
  550. border-radius: 50%;
  551. display: flex;
  552. align-items: center;
  553. justify-content: center;
  554. cursor: pointer;
  555. z-index: 10;
  556. transition: 0.2s;
  557. &:hover {
  558. background: #f56c6c;
  559. }
  560. i {
  561. font-size: 14px;
  562. }
  563. }
  564. // 默认图片
  565. .default-img {
  566. width: 100%;
  567. height: 200px;
  568. display: flex;
  569. align-items: center;
  570. justify-content: center;
  571. background-color: #f5f7fa;
  572. border: 2px solid #dcdfe6;
  573. border-radius: 4px;
  574. img {
  575. width: 180px;
  576. height: 180px;
  577. object-fit: cover;
  578. }
  579. }
  580. .detailBook {
  581. ::v-deep .el-dialog {
  582. width: 1000px !important;
  583. .el-dialog__body{
  584. padding: 0 0 30px 0;
  585. ::-webkit-scrollbar{
  586. width: 5px !important;
  587. height: 5px !important;
  588. }
  589. ::-webkit-scrollbar-thumb{
  590. background-color: #f5f7fa !important;
  591. }
  592. }
  593. }
  594. .detail-check{
  595. display: flex;
  596. justify-content: space-between;
  597. align-items: flex-start;
  598. padding: 12px 30px;
  599. background-color: #F6F8FC;
  600. overflow: hidden;
  601. }
  602. .book-detail{
  603. display: flex;
  604. flex-direction: column;
  605. justify-content: flex-start;
  606. li{
  607. line-height: 30px;
  608. span{
  609. display: inline-block;
  610. width: 120px;
  611. text-align: right;
  612. margin-right: 10px;
  613. color: #0C0E1E;
  614. }
  615. i{
  616. font-style: normal;
  617. padding: 0 8px;
  618. }
  619. &.row-li{
  620. width: 100%
  621. }
  622. &.white-item {
  623. color: #606266;
  624. span {
  625. color: #0348F3 !important;
  626. }
  627. }
  628. }
  629. &.white-detail{
  630. border-radius: 4px;
  631. background-color: #EEF5FE;
  632. margin-top: 4px;
  633. & .white-title{
  634. display: flex;
  635. justify-content: flex-start;
  636. align-items: center;
  637. font-size: 12px;
  638. color: #606266;
  639. padding: 6px;
  640. p{
  641. padding: 0 10px;
  642. }
  643. .small-line{
  644. display: inline-block;
  645. width: 40px;
  646. border-bottom: 1px solid #a9aeb8;
  647. }
  648. .big-line{
  649. display: inline-block;
  650. flex: 1;
  651. // height: 1px;
  652. border-bottom: 1px solid #a9aeb8;
  653. // background-color: #a9aeb8;
  654. }
  655. }
  656. }
  657. }
  658. ::v-deep .dialog-footer{
  659. margin-top: 30px;
  660. }
  661. }
  662. .dialog-footer{
  663. margin: 20px auto 0 auto;
  664. }
  665. ::v-deep .el-table__fixed-right{
  666. background-color: #fff !important;
  667. }
  668. // 数据行单元格
  669. ::v-deep .white-list-cell {
  670. // background-color: #EAF3FB !important;
  671. color: #0348F3 !important;
  672. }
  673. // 表头单元格
  674. ::v-deep .white-list-header-cell {
  675. background-color: #EAF3FB !important;
  676. }
  677. </style>