List.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  1. <script setup name="WarResearchReport">
  2. import {setHightLightText} from '@/hooks/common'
  3. import {computed, nextTick, onMounted, reactive,ref,watch} from 'vue'
  4. import apiReport from '@/api/report'
  5. import {reportExternalInterface} from '@/api/reportExternal'
  6. import moment from 'moment'
  7. import _ from 'lodash'
  8. import { showToast,showDialog,Dialog } from 'vant';
  9. import { useRouter,useRoute } from 'vue-router';
  10. const router = useRouter()
  11. const route = useRoute()
  12. const isReportWarResearch = computed(() => {
  13. return route.path === '/war_research_report/list'
  14. })
  15. //睿思
  16. const isRise = computed(()=> {
  17. return isReportWarResearch.value && listState.reportType===2
  18. })
  19. //是否显示一键清空选项
  20. const showCleanFilterBox=computed(()=>{
  21. if(isClickClose.value) return false
  22. if(
  23. listState.classifys.length||
  24. listState.permissions.length
  25. ) return true
  26. })
  27. const isSearch=ref(false) // 是否为搜索状态
  28. const isClickClose=ref(false)//是否点击过关闭一键清空模块
  29. function handleCleanFilter(){
  30. listState.classifys=[]
  31. listState.permissions=[]
  32. listState.keyWord=''
  33. showMoreFilter.value = false
  34. refreshList()
  35. }
  36. const classifyOptions = ref([])
  37. const permissionOptions = ref([])
  38. async function getClassify(type='') {
  39. const res = await reportExternalInterface.getClasssify()
  40. if (res.Ret !== 200) return
  41. classifyOptions.value = res.Data||[];
  42. filterEmpty(classifyOptions.value)
  43. if(type === 'init') {
  44. // listState.classifys = collectClassifyOpts.value.length ? collectClassifyOpts.value.map(_ => _.Id) : [];
  45. getList()
  46. handleShowFilter()
  47. }
  48. }
  49. getClassify('init')
  50. function filterEmpty(arr) {
  51. arr.length && arr.forEach(item => {
  52. item.Children.length && filterEmpty(item.Children)
  53. if(!item.Children.length) {
  54. item.Children = null
  55. }
  56. })
  57. }
  58. async function getPermissionList() {
  59. const res = await reportExternalInterface.getPermission()
  60. if(res.Ret !== 200) return
  61. permissionOptions.value = res.Data || []
  62. filterEmpty(permissionOptions.value)
  63. }
  64. getPermissionList()
  65. //收藏分类 只用在战研报告
  66. const collectClassifyOpts = computed(() => {
  67. return isReportWarResearch.value ? findCollectItem(classifyOptions.value) : []
  68. })
  69. function findCollectItem(arr) {
  70. let collectArr = []
  71. function traverse(node) {
  72. if (node.IsCollect === 1&&!node.Children?.length) {
  73. collectArr.push(node);
  74. }
  75. if (node.Children && node.Children.length) {
  76. node.Children.forEach(child => traverse(child));
  77. }
  78. }
  79. arr.forEach(item => traverse(item));
  80. return collectArr
  81. }
  82. const listState = reactive({
  83. reportType: 1,
  84. classifys: [],
  85. permissions:[],
  86. keyWord:'',
  87. list:[],
  88. page:1,
  89. pageSize:20,
  90. finished:false,
  91. loading:false
  92. })
  93. watch(
  94. ()=>listState.keyWord,
  95. (val)=>{
  96. console.log(val)
  97. if(!val){
  98. isSearch.value=false
  99. }
  100. }
  101. )
  102. async function getList(){
  103. const res = isRise.value
  104. ? await reportExternalInterface.getRiseReportList({
  105. ChartPermissionIdList: listState.permissions.join(','),
  106. Keyword: listState.keyWord,
  107. PageSize: listState.pageSize,
  108. CurrentIndex: listState.page,
  109. ClassifyIdList: listState.classifys.join(','),
  110. OrderField: '',
  111. OrderType: ''
  112. })
  113. : await reportExternalInterface.getDocList({
  114. DocumentType: isReportWarResearch.value ? 2 : 1,
  115. ChartPermissionIdList: listState.permissions.join(','),
  116. ClassifyIdList: listState.classifys.join(','),
  117. Keyword: listState.keyWord,
  118. PageSize: listState.pageSize,
  119. CurrentIndex: listState.page,
  120. OrderField: '',
  121. OrderType: ''
  122. })
  123. if(res.Ret !== 200) return
  124. listState.loading=false
  125. if(!res.Data){
  126. listState.finished=true
  127. return
  128. }
  129. listState.finished=res.Data.Paging.IsEnd
  130. const arr=res.Data.List||[]
  131. listState.list= listState.page < 2 ? arr : [...listState.list,...arr]
  132. }
  133. function onLoad(){
  134. listState.page++
  135. getList()
  136. }
  137. function refreshList(){
  138. document.documentElement.scrollTop=0
  139. isSearch.value=true
  140. listState.page=1
  141. listState.list=[]
  142. listState.finished=false
  143. getList()
  144. }
  145. function handleReportChange() {
  146. listState.keyWord = '';
  147. listState.loading = true;
  148. // listState.permissions = [];
  149. showMoreFilter.value = false
  150. refreshList()
  151. }
  152. //筛选项弹窗
  153. const showMoreFilter=ref(false)
  154. const permissionDropMenuIns = ref(null)
  155. const clasifyDropMenuIns = ref(null)
  156. function handleShowFilter() {
  157. if(showMoreFilter.value) return
  158. selectPermissionVal.value=_.cloneDeep(listState.permissions)
  159. selectClassifyVal.value=_.cloneDeep(listState.classifys)
  160. showMoreFilter.value=true
  161. nextTick(()=>{
  162. setTimeout(() => {
  163. permissionDropMenuIns.value?.toggle(true)
  164. }, 100);
  165. })
  166. }
  167. const selectPermissionVal = ref([])
  168. function handleChangeSelectPermission(item) {
  169. selectPermissionVal.value.includes(item.chart_permission_id)
  170. ? selectPermissionVal.value.splice(selectPermissionVal.value.findIndex(_ => _===item.chart_permission_id),1)
  171. : selectPermissionVal.value.push(item.chart_permission_id)
  172. }
  173. function handleConfirmFilter() {
  174. console.log(selectClassifyVal.value)
  175. listState.classifys = selectClassifyVal.value;
  176. listState.permissions = selectPermissionVal.value;
  177. refreshList()
  178. showMoreFilter.value=false
  179. }
  180. const selectClassifyVal = ref([])
  181. function handleChangeClassify(item) {
  182. if(item.Children?.length) {
  183. item.isSlide = !item.isSlide
  184. }else {
  185. selectClassifyVal.value.includes(item.Id)
  186. ? selectClassifyVal.value.splice(selectClassifyVal.value.findIndex(_ => _===item.Id),1)
  187. : selectClassifyVal.value.push(item.Id)
  188. }
  189. }
  190. async function handleChangeCollect(item) {
  191. const res = await reportExternalInterface.collectClassify({
  192. ClassifyId: item.Id
  193. })
  194. if(res.Ret !== 200) return
  195. item.IsCollect = item.IsCollect?0:1
  196. showToast(item.IsCollect===1?'收藏成功':'取消收藏成功')
  197. }
  198. //报告收藏是报告分类收藏 神奇的设计
  199. async function handleChangeReportClassifyCollect(item) {
  200. item.IsCollect === 1 && await showDialog({
  201. title: '提示',
  202. message: '确认取消收藏该报告分类吗?',
  203. showCancelButton:true
  204. })
  205. let ClassifyId = isRise.value ? (item.ClassifyIdThird||item.ClassifyIdSecond||item.ClassifyIdFirst) : item.ClassifyId;
  206. const res = await reportExternalInterface.collectClassify({
  207. ClassifyId
  208. })
  209. if(res.Ret !== 200) return
  210. item.IsCollect = item.IsCollect?0:1
  211. listState.list.forEach(_ => {
  212. let reportClssifyId = isRise.value ? (_.ClassifyIdThird||_.ClassifyIdSecond||_.ClassifyIdFirst) : _.ClassifyId;
  213. if(ClassifyId===reportClssifyId) {
  214. _.IsCollect = item.IsCollect;
  215. }
  216. })
  217. showToast(item.IsCollect===1?'收藏报告分类成功':'取消收藏成功')
  218. getClassify()
  219. }
  220. // 跳转详情
  221. function goDetail(item){
  222. console.log(item);
  223. if(isRise.value) { //普通报告预览
  224. router.push({
  225. path:"/report/preview",
  226. query:{
  227. id:item.Id
  228. }
  229. })
  230. }else {
  231. router.push({
  232. path:"/external_report/preview",
  233. query:{
  234. id:item.OutsideReportId
  235. }
  236. })
  237. }
  238. }
  239. </script>
  240. <template>
  241. <div class="report-list-page">
  242. <div class="sticky-box">
  243. <div class="clear-filter-box" v-if="showCleanFilterBox">
  244. <span>想要清空所有筛选项?试试</span>
  245. <span @click="handleCleanFilter" style="display:flex;align-items:center">
  246. <span style="color:#0052D9">一键清空</span>
  247. <img class="rocket" src="@/assets/imgs/icon_rocket.png" alt="">
  248. </span>
  249. <van-icon name="cross" class="close-icon" @click="isClickClose=true"/>
  250. </div>
  251. <van-tabs
  252. v-if="isReportWarResearch"
  253. v-model:active="listState.reportType"
  254. type="card"
  255. border
  256. @change="handleReportChange"
  257. >
  258. <van-tab title="PCI研报" :name="1"/>
  259. <van-tab title="睿思研报" :name="2"/>
  260. </van-tabs>
  261. <div class="top-box">
  262. <van-search
  263. v-model="listState.keyWord"
  264. style="flex:1"
  265. shape="round"
  266. placeholder="请输入报告标题或创建人"
  267. @search="refreshList"
  268. />
  269. <div
  270. :class="['menu-icon',{
  271. 'active': listState.MsgIsSend||listState.publishStatus
  272. }]"
  273. @click="handleShowFilter"
  274. >
  275. <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
  276. <path d="M30.283 23.977L40.824 9.5685C41.3719 8.81954 41.6002 7.88381 41.459 6.96667C41.3177 6.04952 40.8184 5.22589 40.0705 4.6765C39.4715 4.23699 38.7479 4 38.005 4H9.995C8.065 4 6.5 5.567 6.5 7.5C6.5 8.244 6.7365 8.9685 7.1755 9.5685L17.717 23.977V42.5C17.717 43.3285 18.3875 44 19.215 44C19.6125 43.9996 19.9935 43.8414 20.2743 43.5601C20.5552 43.2788 20.7128 42.8975 20.7125 42.5V23.486C20.7125 23.1675 20.611 22.857 20.423 22.5995L9.592 7.7955C9.53761 7.72096 9.50489 7.63283 9.49745 7.54085C9.49001 7.44887 9.50814 7.35663 9.54984 7.27431C9.59155 7.192 9.65519 7.12281 9.73375 7.0744C9.81231 7.02599 9.90272 7.00024 9.995 7H38.005C38.0973 7.00015 38.1878 7.02586 38.2664 7.07427C38.345 7.12268 38.4086 7.1919 38.4503 7.27426C38.492 7.35663 38.51 7.44892 38.5025 7.54092C38.4949 7.63292 38.4621 7.72104 38.4075 7.7955L27.5765 22.5995C27.3884 22.8568 27.287 23.1673 27.287 23.486V38.271C27.287 39.0995 27.9575 39.771 28.785 39.771C28.9819 39.7709 29.1768 39.732 29.3586 39.6565C29.5404 39.5811 29.7056 39.4705 29.8447 39.3312C29.9838 39.192 30.0941 39.0266 30.1693 38.8447C30.2445 38.6628 30.2831 38.4678 30.283 38.271V23.977Z" fill="currentColor"/>
  277. </svg>
  278. </div>
  279. </div>
  280. <template v-if="showMoreFilter">
  281. <van-dropdown-menu :close-on-click-overlay="false" :close-on-click-outside="false">
  282. <van-dropdown-item title="品种标签" ref="permissionDropMenuIns">
  283. <div class="drop-opt-box">
  284. <ul class="list">
  285. <li
  286. :class="['item',selectPermissionVal.includes(item.chart_permission_id)?'active':'']"
  287. v-for="item in permissionOptions"
  288. :key="item.chart_permission_id"
  289. @click="item.isSlide = !item.isSlide"
  290. >
  291. <div class="list-top">
  292. <h4>{{item.permission_name}}</h4>
  293. <van-icon
  294. v-if="item.Children"
  295. :name="!item.isSlide?'arrow-up':'arrow-down'"
  296. />
  297. </div>
  298. <ul class="sub-list" v-if="item.Children&&!item.isSlide">
  299. <li
  300. :class="['sub-item',{'active':selectPermissionVal.includes(subItem.chart_permission_id)}]"
  301. v-for="subItem in item.Children"
  302. :key="subItem.chart_permission_id"
  303. @click.stop="handleChangeSelectPermission(subItem)"
  304. >{{subItem.permission_name}}</li>
  305. </ul>
  306. </li>
  307. <li class="item" style="height:0"></li>
  308. </ul>
  309. <div class="bot-btn-box">
  310. <div class="btn cancel-btn" @click="showMoreFilter=false">取消</div>
  311. <div class="btn confirm-btn" @click="handleConfirmFilter">确定</div>
  312. </div>
  313. </div>
  314. </van-dropdown-item>
  315. <van-dropdown-item title="全部分类" ref="clasifyDropMenuIns">
  316. <div class="drop-opt-box classify-box">
  317. <ul class="list">
  318. <li
  319. :class="['item',
  320. {'active':selectClassifyVal.includes(item.Id)&&!item.Children?.length},
  321. ]"
  322. v-for="item in classifyOptions"
  323. :key="item.Id"
  324. @click="handleChangeClassify(item)"
  325. >
  326. <div class="list-top">
  327. <h4>{{item.ClassifyName}}</h4>
  328. <van-icon
  329. v-if="item.Children"
  330. :name="item.isSlide?'arrow-up':'arrow-down'"
  331. />
  332. <svg-icon
  333. v-else-if="!item.Children&&isReportWarResearch"
  334. :name="item.IsCollect?'collect_ico':'cancel_collect_ico'"
  335. size="20px"
  336. @click.stop="handleChangeCollect(item)"
  337. />
  338. </div>
  339. <ul class="classify-sub-list" v-if="item.Children&&item.isSlide">
  340. <li
  341. :class="['sub-item',
  342. {'active':selectClassifyVal.includes(subItem.Id)&&!subItem.Children?.length}
  343. ]"
  344. v-for="subItem in item.Children"
  345. :key="subItem.Id"
  346. @click.stop="handleChangeClassify(subItem)"
  347. >
  348. <div class="list-top">
  349. <span>{{subItem.ClassifyName}}</span>
  350. <van-icon
  351. v-if="subItem.Children"
  352. :name="subItem.isSlide?'arrow-up':'arrow-down'"
  353. />
  354. <svg-icon
  355. v-else-if="!subItem.Children&&isReportWarResearch"
  356. :name="subItem.IsCollect?'collect_ico':'cancel_collect_ico'"
  357. size="20px"
  358. @click.stop="handleChangeCollect(subItem)"
  359. />
  360. </div>
  361. <ul class="classify-sub-list" v-if="subItem.Children&&subItem.isSlide">
  362. <li
  363. :class="['sub-item',
  364. {'active':selectClassifyVal.includes(thirdItem.Id)}
  365. ]"
  366. v-for="thirdItem in subItem.Children"
  367. :key="thirdItem.Id"
  368. @click.stop="handleChangeClassify(thirdItem)"
  369. >
  370. <div class="list-top">
  371. <span>{{thirdItem.ClassifyName}}</span>
  372. <van-icon
  373. v-if="thirdItem.Children"
  374. :name="thirdItem.isSlide?'arrow-up':'arrow-down'"
  375. />
  376. <svg-icon
  377. v-else-if="!thirdItem.Children&&isReportWarResearch"
  378. :name="thirdItem.IsCollect?'collect_ico':'cancel_collect_ico'"
  379. size="20px"
  380. @click.stop="handleChangeCollect(thirdItem)"
  381. />
  382. </div>
  383. </li>
  384. </ul>
  385. </li>
  386. </ul>
  387. </li>
  388. </ul>
  389. <div class="bot-btn-box">
  390. <div class="btn cancel-btn" @click="showMoreFilter=false">取消</div>
  391. <div class="btn confirm-btn" @click="handleConfirmFilter">确定</div>
  392. </div>
  393. </div>
  394. </van-dropdown-item>
  395. <van-dropdown-item title="收藏分类" ref="collectDropMenuIns" v-if="isReportWarResearch">
  396. <div class="drop-opt-box classify-box">
  397. <ul class="list" v-if="collectClassifyOpts.length">
  398. <li
  399. :class="['item',
  400. {'active':selectClassifyVal.includes(item.Id)},
  401. ]"
  402. v-for="item in collectClassifyOpts"
  403. :key="item.Id"
  404. @click="handleChangeClassify(item)"
  405. >
  406. <div class="list-top">
  407. <h4>{{item.ClassifyName}}</h4>
  408. <svg-icon
  409. :name="item.IsCollect?'collect_ico':'cancel_collect_ico'"
  410. size="20px"
  411. @click.stop="handleChangeCollect(item)"
  412. />
  413. </div>
  414. </li>
  415. </ul>
  416. <div class="no-list" v-else>
  417. 暂无收藏
  418. </div>
  419. <div class="bot-btn-box">
  420. <div class="btn cancel-btn" @click="showMoreFilter=false">取消</div>
  421. <div class="btn confirm-btn" @click="handleConfirmFilter">确定</div>
  422. </div>
  423. </div>
  424. </van-dropdown-item>
  425. </van-dropdown-menu>
  426. </template>
  427. </div>
  428. <van-list
  429. v-model:loading="listState.loading"
  430. :finished="listState.finished"
  431. :offset="100"
  432. :finished-text="listState.list.length>0?'没有更多了':'暂无相关报告'"
  433. @load="onLoad"
  434. :immediate-check="false"
  435. >
  436. <img v-if="listState.list.length==0&&listState.finished" class="list-empty-img" src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
  437. <ul class="list-wrap">
  438. <li
  439. v-for="item in listState.list"
  440. :key="item.Id"
  441. class="select-text-disabled item"
  442. @click="goDetail(item)"
  443. >
  444. <div class="list-top">
  445. <h2 class="van-ellipsis title">
  446. <span v-html="isSearch?setHightLightText(item.Title,listState.keyWord):item.Title"></span>
  447. <template v-if="isRise">
  448. ({{ moment(item.MsgSendTime||item.PublishTime||item.CreateTime).format('MMDD')}})
  449. </template>
  450. <template v-else>
  451. ({{ moment(item.ReportUpdateTime).format('MMDD') }})
  452. </template>
  453. <svg-icon
  454. v-if="isReportWarResearch"
  455. class="handle-icon"
  456. :name="item.IsCollect?'collect_ico':'cancel_collect_ico'"
  457. size="20px"
  458. @click.stop="handleChangeReportClassifyCollect(item)"
  459. />
  460. </h2>
  461. </div>
  462. <p class="van-multi-ellipsis--l2 des">{{item.Abstract}}</p>
  463. <div class="bot-info">
  464. <div class="time">
  465. <span style="margin-right:2px">{{moment(item.ModifyTime).format('YYYY-MM-DD')}}</span>
  466. </div>
  467. <span class="author van-ellipsis">{{item.SysUserName}}</span>
  468. </div>
  469. </li>
  470. </ul>
  471. </van-list>
  472. </div>
  473. </template>
  474. <style lang="scss" scoped>
  475. .sticky-box{
  476. position: sticky;
  477. top: 0;
  478. z-index: 99;
  479. border-bottom: 1px solid #E7E7E7;
  480. background: #fff;
  481. :deep(.van-dropdown-menu__bar){
  482. box-shadow: none;
  483. border-bottom: 1px solid $border-color;
  484. }
  485. :deep(.van-tabs) {
  486. padding-top: 20px;
  487. }
  488. .bot-btn-box{
  489. border-top: 1px solid $border-color;
  490. padding: 32px;
  491. display: flex;
  492. justify-content: space-between;
  493. .btn{
  494. width: 327px;
  495. height: 80px;
  496. display: flex;
  497. justify-content: center;
  498. align-items: center;
  499. border-radius: 12px;
  500. font-size: 32px;
  501. font-weight: 600;
  502. }
  503. .cancel-btn{
  504. background-color: #F2F3FF;
  505. color: $theme-color;
  506. }
  507. .confirm-btn{
  508. background-color: $theme-color;
  509. color: #fff;
  510. }
  511. }
  512. .clear-filter-box{
  513. padding: 0 34px;
  514. height: 84px;
  515. background-color: #F2F3FF;
  516. display: flex;
  517. align-items: center;
  518. font-size: 28px;
  519. position: relative;
  520. .rocket{
  521. width: 48px;
  522. height: 48px;
  523. }
  524. .close-icon{
  525. position: absolute;
  526. right: 34px;
  527. top: 50%;
  528. transform: translateY(-50%);
  529. }
  530. }
  531. }
  532. .top-box{
  533. padding: 30px 34px;
  534. background-color: #fff;
  535. display: flex;
  536. align-items: center;
  537. .menu-icon{
  538. width: 70px;
  539. height: 70px;
  540. display: flex;
  541. align-items: center;
  542. justify-content: center;
  543. background-color: #F2F6FA;
  544. margin-left: 20px;
  545. border-radius: 50%;
  546. &.active{
  547. color: $theme-color;
  548. }
  549. svg{
  550. width: 48px;
  551. height: 48px;
  552. }
  553. }
  554. :deep(.van-search){
  555. padding: 0;
  556. }
  557. }
  558. .list-wrap{
  559. padding: 30px 34px;
  560. .item{
  561. padding: 20px;
  562. margin-bottom: 20px;
  563. border: 1px solid $border-color;
  564. box-shadow: 0px 3px 12px rgba(52, 75, 120, 0.08);
  565. border-radius: 8px;
  566. .list-top {
  567. display: flex;
  568. justify-content: space-between;
  569. .status {
  570. flex-shrink: 0;
  571. }
  572. }
  573. .title{
  574. width: 100%;
  575. font-size: 32px;
  576. line-height: 44px;
  577. margin: 0;
  578. padding-right: 50px;
  579. position: relative;
  580. .handle-icon {
  581. position: absolute;
  582. right: 0;
  583. top: 0;
  584. }
  585. }
  586. .inline-title{
  587. margin-left: -14px;
  588. }
  589. .des{
  590. margin-top: 10px;
  591. margin-bottom: 20px;
  592. font-size: 28px;
  593. color: $font-grey;
  594. min-height: 60px;
  595. }
  596. .bot-info{
  597. display: flex;
  598. justify-content: space-between;
  599. align-items: center;
  600. color: $font-grey;
  601. font-size: 28px;
  602. .time{
  603. flex-shrink: 0;
  604. }
  605. .author {
  606. flex: 1;
  607. margin-left: 15px;
  608. text-align: right;
  609. }
  610. }
  611. }
  612. }
  613. .drop-opt-box {
  614. /* padding: 0 30px; */
  615. .list {
  616. padding: 0 40px 40px 60px;
  617. max-height: 40vh;
  618. overflow: auto;
  619. }
  620. .list-top {
  621. display: flex;
  622. justify-content: space-between;
  623. align-items: center;
  624. margin: 40px 0;
  625. h4 {
  626. margin: 0;
  627. }
  628. }
  629. .sub-list {
  630. display: flex;
  631. flex-wrap: wrap;
  632. gap: 20px;
  633. .sub-item {
  634. padding: 6px 20px;
  635. background-color: #F8F8FA;
  636. &.active {
  637. color: $theme-color;
  638. background-color: #F2F3FF;
  639. }
  640. }
  641. }
  642. }
  643. .classify-box {
  644. .classify-sub-list {
  645. .sub-item {
  646. margin-left: 40px;
  647. }
  648. }
  649. .active {
  650. color: $theme-color;
  651. position: relative;
  652. &::after {
  653. content: '';
  654. display: block;
  655. width: 36px;
  656. height: 36px;
  657. background-image: url('@/assets/imgs/icon_select2.png');
  658. background-size: cover;
  659. background-repeat: no-repeat;
  660. position: absolute;
  661. left: -40px;
  662. top: 0;
  663. }
  664. }
  665. .no-list {
  666. text-align: center;
  667. padding: 50px 0;
  668. }
  669. }
  670. @media screen and (min-width:$media-width){
  671. .sticky-box{
  672. top: 60px;
  673. .bot-btn-box{
  674. padding: 32px;
  675. justify-content: flex-end;
  676. .btn{
  677. width: 120px;
  678. height: 40px;
  679. border-radius: 6px;
  680. font-size: 16px;
  681. margin-left: 20px;
  682. }
  683. }
  684. .clear-filter-box{
  685. padding: 0 17px;
  686. height: 42px;
  687. font-size: 14px;
  688. .rocket{
  689. width: 24px;
  690. height: 24px;
  691. }
  692. .close-icon{
  693. right: 17px;
  694. }
  695. }
  696. }
  697. .top-box{
  698. padding: 15px;
  699. .menu-icon{
  700. width: 40px;
  701. height: 40px;
  702. svg{
  703. width: 28px;
  704. height: 28px;
  705. }
  706. }
  707. }
  708. .list-wrap{
  709. padding: 30px;
  710. .item{
  711. padding: 20px;
  712. margin-bottom: 20px;
  713. border-radius: 4px;
  714. .title{
  715. font-size: 16px;
  716. line-height: 22px;
  717. .tag{
  718. width: 50px;
  719. height: 22px;
  720. line-height: 22px;
  721. font-size: 14px;
  722. border-radius: 2px;
  723. }
  724. }
  725. .inline-title{
  726. margin-left: -14px;
  727. }
  728. .des{
  729. margin-top: 5px;
  730. margin-bottom: 10px;
  731. font-size: 14px;
  732. min-height: 30px;
  733. }
  734. .bot-info{
  735. font-size: 14px;
  736. }
  737. }
  738. }
  739. .drop-opt-box {
  740. /* padding: 0 30px; */
  741. .list {
  742. padding: 0 40px;
  743. max-height: 40vh;
  744. overflow: auto;
  745. }
  746. .list-top {
  747. display: flex;
  748. justify-content: space-between;
  749. align-items: center;
  750. margin: 40px 0;
  751. h4 {
  752. margin: 0;
  753. }
  754. }
  755. .sub-list {
  756. display: flex;
  757. flex-wrap: wrap;
  758. gap: 20px;
  759. .sub-item {
  760. padding: 6px 20px;
  761. background-color: #F8F8FA;
  762. &.active {
  763. color: $theme-color;
  764. background-color: #F2F3FF;
  765. }
  766. }
  767. }
  768. }
  769. .bot-btns{
  770. bottom: 24px;
  771. }
  772. }
  773. </style>