index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. <template>
  2. <div class="header-actions" v-if="getActionList.length != 0 &&getActionList.length>2">
  3. <div class="overflow-box">
  4. <el-button v-for="(item, index) in getActionList" :key="index" :type="item.type || 'primary'" :plain="item.plain || false"
  5. v-bind="getHeaderActions(item)" @click="item.action" :disabled="item.disabled || false">
  6. {{ item.text }}
  7. </el-button>
  8. </div>
  9. </div>
  10. <div class="stat-warp" v-if="statConfig.length != 0" :class="statWarpHeight > 200 && isMore ? 'show-more' : ''">
  11. <div class="title">
  12. <select v-model="statSelectVal" v-if="statConfig.length > 1" @change="changeStatData">
  13. <option :value="index" v-for="(i, index) in statConfig" :key="index">
  14. {{ i.label }}
  15. </option>
  16. </select>
  17. <div v-if="statConfig.length === 1">{{ statConfig[0].label }}</div>
  18. </div>
  19. <div class="more-btn" @click="isMore = !isMore" v-if="statWarpHeight > 200">
  20. <span>
  21. <i v-if="!isMore" class="iconfont icon-btn_xiala22"></i>
  22. <i v-else class="iconfont icon-btn_shouqi22"></i>
  23. </span>
  24. </div>
  25. <ul id="statWarp">
  26. <li v-show="!i.data" :class="'theme' + i.type" v-for="(i, index) in statConfig[statSelectVal].data" :key="index"
  27. @click="i.click ? i.click(i, index) : ''" :style="i.click ? 'cursor: pointer' : ''">
  28. <div class="label">{{ i.label }}</div>
  29. <div class="num">{{ i.num }}</div>
  30. </li>
  31. <li v-show="i.data" v-for="(i, index) in statConfig[statSelectVal].data" :key="index" class="multi-data" :class="'theme' + i.type"
  32. @click="i.click ? i.click(i, index) : ''" :style="i.click ? 'cursor: pointer' : ''">
  33. <div class="label">{{ i.label }}</div>
  34. <div class="num-warp">
  35. <div class="num-box" v-for="(j, jindex) in i.data" :key="jindex">
  36. <div class="num-small" :style="'color:' + j.color">
  37. {{ j.num }}
  38. </div>
  39. <div class="label-small">{{ j.label }}</div>
  40. </div>
  41. </div>
  42. </li>
  43. </ul>
  44. </div>
  45. <div class="table-list-container by-table" v-loading="loading" v-if="!hideAll">
  46. <!-- v-if="!hideHeader" -->
  47. <header v-if="false" class="header">
  48. <h2>{{ title }}</h2>
  49. </header>
  50. <div class="by-search" v-if="!hideSearch">
  51. <div style="display: flex">
  52. <div v-if="getActionList.length != 0 &&getActionList.length <=2" style="margin-right:10px">
  53. <el-button v-for="(item, index) in getActionList" :key="index" :type="item.type || 'primary'" :plain="item.plain || false"
  54. v-bind="getHeaderActions(item)" @click="item.action" :disabled="item.disabled || false">
  55. {{ item.text }}
  56. </el-button>
  57. </div>
  58. <div class="by-dropdown" v-for="(i, index) in selectConfigCopy" :key="i.prop" style="margin-right: 10px">
  59. <div v-if="i.type" class="selectTime" style="display:flex;align-items:center">
  60. <span style="font-size:14px;height:32px;margin-right:15px">{{i.label || ''}}</span>
  61. <el-date-picker v-model="pagination[i.prop]" type="date" size="small" :placeholder="i.placeholder" style="width:120px" />
  62. <span style="margin-right:15px">-</span>
  63. <el-date-picker v-model="pagination[i.propOne]" type="date" size="small" :placeholder="i.placeholderOne" style="width:120px" />
  64. </div>
  65. <div v-else>
  66. <div class="by-dropdown-title">
  67. {{
  68. pagination[i.prop]
  69. ? i.data.find((j) => j.value === pagination[i.prop])
  70. ? i.data.find((j) => j.value === pagination[i.prop]).label
  71. : i.label
  72. : i.labelCopy
  73. }}
  74. <!-- {{ i.label || i.labelCopy }} -->
  75. <i style="margin-left: 5px" class="iconfont icon-iconm_xialan1"></i>
  76. </div>
  77. <ul class="by-dropdown-lists">
  78. <li @click="searchItemSelct('all', i, index)" v-if="i.isShowAll === false ? i.isShowAll : true" style="">
  79. {{ $t("common.all") }}
  80. </li>
  81. <li v-for="j in i.data" :key="j.value" @click="searchItemSelct(j, i)" style="">
  82. {{ j.label }}
  83. </li>
  84. </ul>
  85. </div>
  86. </div>
  87. </div>
  88. <div style="display: flex">
  89. <el-input :placeholder="$t('common.pleaseEnterKeywords')" suffix-icon="search" size="mini" v-model="pagination.keyword"
  90. @keyup.enter="searchFn">
  91. </el-input>
  92. <el-button type="primary" style="margin-left: 10px" size="default" @click="searchFn">{{ $t("common.search") }}</el-button>
  93. <div class="more-icon" @click="retrievalModalFn" v-if="$attrs.onMoreSearch">
  94. <i class="iconfont icon-iconx_saixuan"></i>
  95. </div>
  96. </div>
  97. </div>
  98. <component :is="containerTag">
  99. <div class="filter-form-container">
  100. <slot />
  101. </div>
  102. <el-table ref="hocElTable" :data="source" v-if="!hideTable" style="width: 100%" v-bind="$attrs" v-on="tableEvents" row-key="id" :tree-props="{
  103. children: 'children',
  104. hasChildren: 'hasChildren',
  105. }" :height="tableHeight">
  106. <el-table-column v-for="(item, index) in configData" :key="index" v-bind="getAttrsValue(item)" :type="item.type || ''" :selectable="
  107. (rowData, rowIndex) => isSelectable(rowData, rowIndex, item)
  108. ">
  109. <template #header v-if="item.attrs.isNeedHeaderSlot">
  110. <slot :name="item.attrs.headerSlot" :headerLabel="item.attrs.label" v-if="item.attrs.headerSlot">
  111. 头部插槽占位符
  112. </slot>
  113. </template>
  114. <template #default="scope" v-if="!item.type">
  115. <slot :name="item.attrs.slot" :item="scope.row" :headerLabel="item.attrs.label" v-if="item.attrs.slot">
  116. 插槽占位符
  117. </slot>
  118. <div v-else-if="isFunction(getValue(scope, item))">
  119. <component :is="renderTypeList[getMatchRenderFunction(item)].target" :cell-list="getValue(scope, item)()" :row="scope.row"
  120. :parent="getParent" @click="
  121. ($event) => {
  122. handleNativeClick(getAttrsValue(item), $event, item);
  123. }
  124. " />
  125. </div>
  126. <div v-else>
  127. {{ getValue(scope, item) }}
  128. </div>
  129. </template>
  130. </el-table-column>
  131. </el-table>
  132. <el-row v-if="!hidePagination" class="table-pagination" justify="end" type="flex">
  133. <el-pagination background layout="total, sizes, prev, pager, next, jumper" :current-page="getPagination.pageNum"
  134. :page-size="getPagination.pageSize" :total="getPagination.total" @size-change="handleSizeChange"
  135. @current-change="handlePageChange" />
  136. </el-row>
  137. </component>
  138. </div>
  139. </template>
  140. <script>
  141. import { isFunction as isFn, isBoolean } from "./type";
  142. import ElementsMapping from "./ElementsMapping";
  143. import ComponentsMapping from "./ComponentsMapping";
  144. import { computed, defineComponent, getCurrentInstance, ref, watch } from "vue";
  145. import expand from "./expand";
  146. import Sortable from "sortablejs";
  147. export default defineComponent({
  148. name: "Table",
  149. components: {
  150. ElementsMapping,
  151. ComponentsMapping,
  152. },
  153. props: {
  154. hideSearch: {
  155. type: Boolean,
  156. default: false,
  157. },
  158. hideAll: {
  159. type: Boolean,
  160. default: false,
  161. },
  162. hideTable: {
  163. type: Boolean,
  164. default: false,
  165. },
  166. //顶部搜索下拉配置
  167. selectConfig: {
  168. type: Array,
  169. default() {
  170. return [];
  171. },
  172. },
  173. // 获取表格元数据时携带的参数
  174. filterParams: {
  175. type: Object,
  176. default() {
  177. return {};
  178. },
  179. },
  180. // 表格加载 loading
  181. loading: {
  182. type: Boolean,
  183. default: false,
  184. },
  185. // 表格名称
  186. title: {
  187. type: String,
  188. default: "",
  189. },
  190. // 表格元数据
  191. source: {
  192. type: Array,
  193. required: true,
  194. default() {
  195. return [];
  196. },
  197. },
  198. tableHeight: {
  199. type: Number,
  200. required: false,
  201. },
  202. searchConfig: {
  203. type: Object,
  204. default() {
  205. return {
  206. keyword: "",
  207. };
  208. },
  209. },
  210. statConfig: {
  211. type: Array,
  212. default() {
  213. return [];
  214. },
  215. },
  216. // 指定外层容器的渲染组件
  217. containerTag: {
  218. type: String,
  219. default: "div",
  220. },
  221. // 是否隐藏表头
  222. hideHeader: {
  223. type: Boolean,
  224. default: false,
  225. },
  226. // 是否隐藏分页
  227. hidePagination: {
  228. type: Boolean,
  229. default: false,
  230. },
  231. // 分页配置
  232. pagination: {
  233. type: Object,
  234. default() {
  235. return {};
  236. },
  237. },
  238. // 表格配置文件
  239. config: {
  240. type: Array,
  241. default() {
  242. return [];
  243. },
  244. },
  245. // 表头右上方的按钮组
  246. actionList: {
  247. type: Array,
  248. default() {
  249. return [{ text: "", action: () => {} }];
  250. },
  251. },
  252. // element table 原生事件
  253. tableEvents: {
  254. type: Object,
  255. default() {
  256. return {};
  257. },
  258. },
  259. searchKey: {
  260. type: String,
  261. default: "keyword",
  262. },
  263. // 是否显示过滤的全部选项
  264. // isShowAll: {
  265. // type: Boolean,
  266. // default: true,
  267. // },
  268. },
  269. setup(props) {
  270. const { proxy } = getCurrentInstance();
  271. // 过滤出有属性的
  272. const configData = ref([]);
  273. configData.value = proxy.config.filter((x) => x && x.attrs);
  274. const selectConfigCopy = computed(() => {
  275. return props.selectConfig.map((item) => {
  276. if (!item.labelCopy) item.labelCopy = { ...item }.label;
  277. return item;
  278. });
  279. });
  280. let isMore = ref(false);
  281. const changeStatData = () => {
  282. statWarpHeight.value = document.getElementById("statWarp").offsetHeight;
  283. };
  284. let statWarpHeight = ref(0);
  285. watch(
  286. proxy.statConfig,
  287. (newValue, oldValue) => {
  288. setTimeout(() => {
  289. //获取statWarp的height
  290. statWarpHeight.value =
  291. document.getElementById("statWarp").offsetHeight;
  292. }, 500);
  293. },
  294. { immediate: true }
  295. );
  296. let statSelectVal = ref(0);
  297. const retrievalModal = ref(false);
  298. const getAttrsValue = (item) => {
  299. const { attrs } = item;
  300. const result = {
  301. ...attrs,
  302. };
  303. delete result.prop;
  304. return result;
  305. };
  306. const renderTypeList = ref({
  307. render: {},
  308. renderHTML: {
  309. target: "elements-mapping",
  310. },
  311. renderComponent: {
  312. target: "components-mapping",
  313. },
  314. renderMoreBtn: {
  315. target: "more-btn",
  316. },
  317. });
  318. const getParent = computed(() => {
  319. return proxy.$parent;
  320. });
  321. const getPagination = computed(() => {
  322. const params = {
  323. pageNum: 1,
  324. pageSize: 10,
  325. total: 0,
  326. };
  327. return Object.assign({}, params, props.pagination);
  328. });
  329. const getActionList = computed(() => {
  330. return props.actionList
  331. .slice()
  332. .reverse()
  333. .filter((it) => it.text);
  334. });
  335. const getValue = (scope, configItem) => {
  336. const prop = configItem.attrs.prop;
  337. const renderName = getMatchRenderFunction(configItem);
  338. const renderObj = renderTypeList.value[renderName];
  339. if (renderObj && isFunction(configItem[renderName])) {
  340. return renderObj.target
  341. ? getRenderValue(scope, configItem, {
  342. name: renderName,
  343. type: "bind",
  344. })
  345. : getRenderValue(scope, configItem);
  346. }
  347. return scope.row[prop];
  348. };
  349. const getRenderValue = (
  350. scope,
  351. item,
  352. fn = { name: "render", type: "call" }
  353. ) => {
  354. const prop = item.attrs.prop;
  355. const propValue = prop && scope.row[prop];
  356. scope.row.$index = scope.$index;
  357. const args = propValue !== undefined ? propValue : scope.row;
  358. return item[fn.name][fn.type](getParent.value, args);
  359. };
  360. // 匹配 render 开头的函数
  361. const getMatchRenderFunction = (obj) => {
  362. return Object.keys(obj).find((key) => {
  363. const matchRender = key.match(/^render.*/);
  364. return matchRender && matchRender[0];
  365. });
  366. };
  367. const isFunction = (fn) => {
  368. return isFn(fn);
  369. };
  370. const searchFn = (val) => {
  371. if (props.loading) return;
  372. proxy.$emit(
  373. "getList",
  374. Object.assign(props.filterParams, {
  375. [props.searchKey]: props.pagination.keyword,
  376. })
  377. );
  378. };
  379. const retrievalModalFn = () => {
  380. proxy.$emit("moreSearch", "");
  381. //获取父组件定义的moreSearch方法
  382. };
  383. const handlePageChange = (val) => {
  384. proxy.$emit(
  385. "getList",
  386. Object.assign(props.filterParams, { pageNum: val })
  387. );
  388. };
  389. const handleSizeChange = (val) => {
  390. proxy.$emit(
  391. "getList",
  392. Object.assign(props.filterParams, { pageSize: val })
  393. );
  394. };
  395. const getHeaderActions = (item) => {
  396. return {
  397. ...item.attrs,
  398. };
  399. };
  400. const stopBubbles = (e) => {
  401. const event = e || window.event;
  402. if (event && event.stopPropagation) {
  403. event.stopPropagation();
  404. } else {
  405. event.cancelBubble = true;
  406. }
  407. };
  408. const handleNativeClick = ({ isBubble }, e, item) => {
  409. // 考虑到单元格内渲染了组件,并且组件自身可能含有点击事件,故添加了阻止冒泡机制
  410. // 若指定 isBubble 为 false,则当前单元格恢复冒泡机制
  411. if (isBoolean(isBubble) && !isBubble) return;
  412. stopBubbles(e);
  413. };
  414. //下拉搜索相关
  415. const searchItemSelct = (item, i, index) => {
  416. if (item == "all") {
  417. i.label = { ...props.selectConfig[index] }.labelCopy;
  418. proxy.$emit(
  419. "getList",
  420. Object.assign(props.filterParams, { [i.prop]: "" })
  421. );
  422. return;
  423. }
  424. i.label = item.label;
  425. proxy.$emit(
  426. "getList",
  427. Object.assign(props.filterParams, { [i.prop]: item.value })
  428. );
  429. };
  430. const isSelectable = (row, index, item) => {
  431. if (item.type === "selection") {
  432. if (item.attrs && item.attrs.checkAtt) {
  433. if (row[item.attrs.checkAtt]) {
  434. return row[item.attrs.checkAtt];
  435. }
  436. } else {
  437. return true;
  438. }
  439. }
  440. };
  441. const hocElTable = ref();
  442. return {
  443. configData,
  444. getParent,
  445. getPagination,
  446. renderTypeList,
  447. getActionList,
  448. getAttrsValue,
  449. getValue,
  450. getRenderValue,
  451. getMatchRenderFunction,
  452. isFunction,
  453. handlePageChange,
  454. handleSizeChange,
  455. getHeaderActions,
  456. stopBubbles,
  457. handleNativeClick,
  458. searchFn,
  459. searchItemSelct,
  460. selectConfigCopy,
  461. isSelectable,
  462. retrievalModal,
  463. retrievalModalFn,
  464. statSelectVal,
  465. statWarpHeight,
  466. isMore,
  467. changeStatData,
  468. hocElTable,
  469. };
  470. },
  471. });
  472. </script>
  473. <style>
  474. .table-list-container th {
  475. color: #333 !important;
  476. }
  477. .by-table td .el-button + .el-button {
  478. margin-left: 0 !important;
  479. }
  480. .by-table td .el-button {
  481. background: none !important;
  482. margin: 0 !important;
  483. padding: 8px 6px !important;
  484. }
  485. .el-checkbox__input.is-disabled .el-checkbox__inner {
  486. background-color: #dee1e6;
  487. border-color: #b2b4b9;
  488. }
  489. .el-table .cell {
  490. line-height: 34px;
  491. }
  492. </style>
  493. <style lang="scss" scoped>
  494. .sortableActive {
  495. background: #f5f7fa !important;
  496. }
  497. .show-more {
  498. height: auto !important;
  499. }
  500. .stat-warp {
  501. margin-bottom: 20px;
  502. background: #fff;
  503. padding: 0 20px;
  504. height: 200px;
  505. overflow: hidden;
  506. position: relative;
  507. .more-btn {
  508. position: absolute;
  509. right: 0;
  510. bottom: 0;
  511. left: 0;
  512. height: 40px;
  513. cursor: pointer;
  514. font-size: 12px;
  515. line-height: 30px;
  516. text-align: center;
  517. background: linear-gradient(
  518. 180deg,
  519. rgba(255, 255, 255, 0) 0%,
  520. rgba(255, 255, 255, 0.8) 100%
  521. );
  522. i {
  523. color: #999;
  524. }
  525. }
  526. .title {
  527. height: 60px;
  528. select {
  529. height: 60px;
  530. border: none;
  531. outline: none;
  532. -webkit-appearance: none;
  533. appearance: none;
  534. font-size: 14px;
  535. font-weight: bold;
  536. background: url("@/assets/images/sanjiao.png") no-repeat right center;
  537. padding-right: 20px;
  538. }
  539. div {
  540. height: 60px;
  541. font-size: 14px;
  542. font-weight: bold;
  543. line-height: 60px;
  544. }
  545. }
  546. ul {
  547. padding: 0;
  548. overflow: hidden;
  549. margin: 0;
  550. li {
  551. list-style: none;
  552. min-width: 285px;
  553. box-sizing: border-box;
  554. margin: 0 20px 20px 0;
  555. background: #eff6ff;
  556. float: left;
  557. overflow: hidden;
  558. padding: 20px;
  559. color: #333333;
  560. border-radius: 10px;
  561. .label {
  562. font-size: 14px;
  563. }
  564. .label::before {
  565. width: 10px;
  566. height: 10px;
  567. content: "";
  568. border-radius: 50%;
  569. background: #0084ff;
  570. display: inline-block;
  571. margin-right: 10px;
  572. }
  573. .num {
  574. margin-top: 10px;
  575. font-size: 24px;
  576. font-weight: bold;
  577. }
  578. }
  579. //#F5F3FF #9E64ED
  580. .theme2 {
  581. background: #f5f3ff;
  582. .label::before {
  583. background: #9e64ed;
  584. }
  585. }
  586. //#FFF1E1 #FF9315
  587. .theme3 {
  588. background: #fff1e1;
  589. .label::before {
  590. background: #ff9315;
  591. }
  592. }
  593. //#E2FBE8 #39C55A
  594. .theme4 {
  595. background: #e2fbe8;
  596. .label::before {
  597. background: #39c55a;
  598. }
  599. }
  600. .theme5 {
  601. background: #ffebe9;
  602. .label::before {
  603. background: #f94539;
  604. }
  605. }
  606. .theme6 {
  607. background: #e4f9f9;
  608. .label::before {
  609. background: #53cbcb;
  610. }
  611. }
  612. .multi-data {
  613. .label::before {
  614. display: none;
  615. }
  616. .label {
  617. font-size: 14px;
  618. font-weight: bold;
  619. color: #333;
  620. margin-bottom: 8px;
  621. }
  622. .num-warp {
  623. overflow: hidden;
  624. .num-box {
  625. float: left;
  626. min-width: 80px;
  627. margin-right: 20px;
  628. .num-small {
  629. font-size: 16px;
  630. font-weight: bold;
  631. margin-bottom: 8px;
  632. }
  633. .label-small {
  634. color: #666;
  635. font-size: 14px;
  636. }
  637. }
  638. }
  639. }
  640. }
  641. }
  642. .by-search {
  643. display: flex;
  644. justify-content: space-between;
  645. margin-bottom: 10px;
  646. .more-icon {
  647. float: right;
  648. cursor: pointer;
  649. line-height: 32px;
  650. text-align: center;
  651. margin-left: 5px;
  652. }
  653. }
  654. .by-dropdown {
  655. position: relative;
  656. text-align: left;
  657. height: 32px;
  658. z-index: 1010;
  659. padding: 0 10px;
  660. transition: all 0.5s ease;
  661. cursor: pointer;
  662. line-height: 32px;
  663. .by-dropdown-title {
  664. font-size: 14px;
  665. background-color: #fff;
  666. }
  667. ul {
  668. position: absolute;
  669. left: 0;
  670. top: 32px;
  671. padding: 0;
  672. margin: 0;
  673. z-index: 100;
  674. display: none;
  675. white-space: nowrap;
  676. min-width: 80px;
  677. li {
  678. list-style: none;
  679. font-size: 12px;
  680. height: 30px;
  681. padding: 0 10px;
  682. text-align: left;
  683. line-height: 30px;
  684. }
  685. li:hover {
  686. background-color: #eff6ff;
  687. color: #0084ff;
  688. }
  689. }
  690. }
  691. .by-dropdown::before {
  692. display: block;
  693. width: 1px;
  694. content: " ";
  695. position: absolute;
  696. height: 14px;
  697. top: 8px;
  698. background-color: #ddd;
  699. right: 0;
  700. z-index: 1011;
  701. }
  702. .by-dropdown:hover {
  703. background: #ffffff;
  704. border-radius: 2px 2px 2px 2px;
  705. opacity: 1;
  706. ul {
  707. background: #ffffff;
  708. box-shadow: 0px 2px 16px 1px rgba(0, 0, 0, 0.06);
  709. border-radius: 2px 2px 2px 2px;
  710. opacity: 1;
  711. display: block;
  712. text-align: left;
  713. }
  714. }
  715. .header-actions {
  716. flex: 1;
  717. overflow-x: auto;
  718. padding: 20px;
  719. background: #fff;
  720. margin-bottom: 20px;
  721. .overflow-box {
  722. :deep() .el-button:nth-child(1) {
  723. margin-left: 10px;
  724. }
  725. }
  726. }
  727. .table-list-container {
  728. background: #fff;
  729. padding: 13px 20px 20px;
  730. .table-pagination {
  731. padding-top: 20px;
  732. }
  733. .header {
  734. display: flex;
  735. padding-bottom: 20px;
  736. }
  737. .el-table {
  738. :deep() th {
  739. font-size: 14px;
  740. }
  741. :deep() td {
  742. font-size: 14px;
  743. }
  744. }
  745. }
  746. .by-dropdown-lists {
  747. max-height: 50vh;
  748. overflow-y: auto;
  749. line-height: 1;
  750. }
  751. :deep(.selectTime .el-input__wrapper) {
  752. box-shadow: none;
  753. }
  754. :deep(.selectTime .el-input__inner) {
  755. color: #000 !important;
  756. font-size: 14px !important;
  757. }
  758. :deep(.selectTime .el-input .el-input__icon) {
  759. color: #000 !important;
  760. font-size: 14px !important;
  761. }
  762. </style>