index.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import React, {PureComponent} from "react";
  2. import {connect} from 'react-redux';
  3. import axios from "axios";
  4. import {ArchivesWrapper, ArticleTop, MainWrapper} from "./style";
  5. import {Link} from 'react-router-dom';
  6. import {Spin} from "antd";
  7. const setYears = (time) => {
  8. const date = new Date(time);
  9. let Y = date.getFullYear() + '年';
  10. let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '月';
  11. return (Y + M)
  12. };
  13. const setDay = (time) => {
  14. const date = new Date(time);
  15. return date.getDate() + '日'
  16. };
  17. const ArchivesList = (props) => {
  18. const {list, loading} = props;
  19. const Class = ['info', 'dark', 'success', 'black', 'warning', 'primary', 'danger'];
  20. if (loading) {
  21. return (
  22. <div className="example">
  23. <Spin size="large"/>
  24. </div>
  25. )
  26. } else {
  27. return (
  28. <div className='wrapper-md'>
  29. <ul className='timeline'>
  30. {list.map((item, index) => {
  31. return (
  32. <div className={Class[index % Class.length]} key={index}>
  33. <li className='tl-header'>
  34. <h2 className='title'>{setYears(item.archiveDate)}</h2>
  35. </li>
  36. {item.archivePosts.map((item2, index2) => {
  37. return (
  38. <div className='tl-body' key={index2}>
  39. <li className='tl-item'>
  40. <div className='tl-wrap'>
  41. <span className='tl-date'>
  42. {setDay(item2.createTime)}
  43. </span>
  44. <h3 className="tl-content">
  45. <span className="arrow left"/>
  46. <Link to={'/article/' + item2.id} className="text-lt">
  47. {item2.title}
  48. </Link>
  49. </h3>
  50. </div>
  51. </li>
  52. </div>
  53. )
  54. })}
  55. </div>
  56. )
  57. })}
  58. <div className='tl-header'>
  59. <div className="start">开始</div>
  60. </div>
  61. </ul>
  62. </div>
  63. )
  64. }
  65. };
  66. class Archives extends PureComponent {
  67. constructor(props) {
  68. super(props);
  69. this.state = {
  70. timg: '',
  71. list: [],
  72. loading: true
  73. }
  74. }
  75. render() {
  76. const {list, loading} = this.state;
  77. return (
  78. <ArchivesWrapper>
  79. <div className='pattern-center-blank'/>
  80. <ArticleTop>
  81. <div className='pattern-attachment-img'>
  82. <img className='lazyload' src={this.state.timg} alt=""/>
  83. </div>
  84. <div className='pattern-header '>
  85. <h1>文章归档</h1>
  86. </div>
  87. </ArticleTop>
  88. <MainWrapper>
  89. <ArchivesList list={list} loading={loading}/>
  90. </MainWrapper>
  91. </ArchivesWrapper>
  92. )
  93. }
  94. componentDidMount() {
  95. this.getArchives();
  96. this.getTimg();
  97. }
  98. getArchives() {
  99. this.setState({loading: true});
  100. axios.get('/posts/archive/v1/list').then((res) => {
  101. if (res.success === 1) {
  102. this.setState({
  103. list: res.models,
  104. loading: false
  105. })
  106. }
  107. });
  108. }
  109. getTimg() {
  110. const list = this.props.topImg;
  111. const num = this.getrand(0, list.length - 1);
  112. this.setState({timg: list[num].img})
  113. }
  114. getrand(m, n) {
  115. return Math.floor(Math.random() * (n - m + 1)) + m;
  116. }
  117. }
  118. const mapState = (state) => {
  119. return {
  120. topImg: state.getIn(['image', 'topImg'])
  121. }
  122. };
  123. export default connect(mapState)(Archives)