index.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import React from 'react';
  2. import { Tooltip } from 'antd';
  3. import './index.less';
  4. import Assets from '@src/components/Assets';
  5. import PieChart from '@src/components/PieChart';
  6. import { formatDate } from '@src/services/Tools';
  7. import Module from '../Module';
  8. import ProgressButton from '../ProgressButton';
  9. import Button from '../Button';
  10. function makePie(value) {
  11. return {
  12. title: {
  13. text: '30%',
  14. textAlign: 'center',
  15. textVerticalAlign: 'middle',
  16. subtext: '全站 60%',
  17. top: '28%',
  18. left: '48%',
  19. },
  20. color: [value < 50 ? '#f19057' : '#6966fb', '#f7f7f7'],
  21. series: [
  22. {
  23. type: 'pie',
  24. radius: ['90%', '100%'],
  25. label: {
  26. show: false,
  27. },
  28. data: [value, 100 - value],
  29. },
  30. ],
  31. };
  32. }
  33. export default function Panel(props) {
  34. const { style, message, data = {}, col = 3, title, onClick } = props;
  35. return (
  36. <Module style={style} className="panel">
  37. <div className="header">
  38. <span>{title}</span>
  39. {message && (
  40. <Tooltip title={message} trigger="click">
  41. <Assets className="qa" name="QA" svg />
  42. </Tooltip>
  43. )}
  44. </div>
  45. <div className="body">
  46. <div className="chart-info">
  47. <PieChart option={makePie(23)} width={110} height={110} />
  48. <div className="info">
  49. {(data.info || []).map(row => {
  50. return (
  51. <div className="item">
  52. <div className="title">{row.title}</div>
  53. <div className="data">
  54. <span className="text">{row.number}</span>
  55. {row.unit}
  56. </div>
  57. </div>
  58. );
  59. })}
  60. {(data.desc || []).length > 0 && (
  61. <div className="desc-wrapper">
  62. {(data.desc || []).map(row => {
  63. return <div className="desc">{row}</div>;
  64. })}
  65. </div>
  66. )}
  67. </div>
  68. </div>
  69. <div className={`list col-${col}`}>
  70. {(data.children || []).map(item => {
  71. return (
  72. <ProgressButton
  73. className="item"
  74. progress={item.progress}
  75. onClick={() => {
  76. if (onClick) onClick(item);
  77. }}
  78. >
  79. {item.title}
  80. </ProgressButton>
  81. );
  82. })}
  83. </div>
  84. </div>
  85. </Module>
  86. );
  87. }
  88. export function WaitPanel(props) {
  89. const { style, message, data = {}, col = 3, title, onClick, onOpen } = props;
  90. return (
  91. <Module style={style} className="panel wait-panel">
  92. <div className="header">
  93. <span>{title}</span>
  94. {message && (
  95. <Tooltip title={message} trigger="click">
  96. <Assets className="qa" name="QA" svg />
  97. </Tooltip>
  98. )}
  99. </div>
  100. <div className="body">
  101. <div className="chart-info">
  102. <div className="info">
  103. <div className="text">您还未开通本月机经</div>
  104. {(data.desc || []).length > 0 && (
  105. <div className="desc-wrapper">
  106. {(data.desc || []).map(row => {
  107. return <div className="desc">{row}</div>;
  108. })}
  109. </div>
  110. )}
  111. {(data.info || []).map(row => {
  112. return (
  113. <div className="item">
  114. <div className="title">{row.title}</div>
  115. <div className="data">
  116. <span className="text">{row.number}</span>
  117. {row.unit}
  118. </div>
  119. </div>
  120. );
  121. })}
  122. </div>
  123. </div>
  124. <div className={`list col-${col}`}>
  125. {(data.children || []).map(item => {
  126. return (
  127. <ProgressButton
  128. className="item"
  129. progress={item.progress}
  130. onClick={() => {
  131. if (onClick) onClick(item);
  132. }}
  133. >
  134. {item.title}
  135. </ProgressButton>
  136. );
  137. })}
  138. </div>
  139. <Button size="lager" radius onClick={() => onOpen && onOpen()}>
  140. 立即开通
  141. </Button>
  142. </div>
  143. </Module>
  144. );
  145. }
  146. export function BuyPanel(props) {
  147. const { style, message, title, onBuy } = props;
  148. return (
  149. <Module style={style} className="panel buy-panel">
  150. <div className="header">
  151. <span>{title}</span>
  152. {message && (
  153. <Tooltip title={message} trigger="click">
  154. <Assets className="qa" name="QA" svg />
  155. </Tooltip>
  156. )}
  157. </div>
  158. <div className="body">
  159. <Assets name="banner" />
  160. <div className="text">您还未购买本月机经</div>
  161. <Button radius size="small" width={80} onClick={() => onBuy && onBuy()}>
  162. 立即购买
  163. </Button>
  164. </div>
  165. </Module>
  166. );
  167. }
  168. export function SmallPanel(props) {
  169. const { style, title, lock, data = {}, onClick } = props;
  170. const { useEndTime, needService } = data;
  171. return (
  172. <Module style={style} className="panel small-panel">
  173. <div className="header">
  174. <span>{title}</span>
  175. {lock && <Assets name="lock" />}
  176. </div>
  177. <div className="body" onClick={() => onClick && onClick()}>
  178. <div className="chart-info">
  179. <PieChart option={makePie(33)} width={110} height={110} />
  180. <div className="info">
  181. {(data.info || []).map(row => {
  182. return (
  183. <div className="item">
  184. <div className="title">{row.title}</div>
  185. <div className="data">
  186. <span className="text">{row.number}</span>
  187. {row.unit}
  188. </div>
  189. </div>
  190. );
  191. })}
  192. {needService && <div className="date">有效期至:{useEndTime && formatDate(useEndTime, 'YYYY-MM-DD')}</div>}
  193. </div>
  194. </div>
  195. </div>
  196. </Module>
  197. );
  198. }
  199. export function SmallWaitPanel(props) {
  200. const { style, title, lock, data = {}, onOpen } = props;
  201. const { endTime } = data;
  202. return (
  203. <Module style={style} className="panel small-wait-panel">
  204. <div className="header">
  205. <span>{title}</span>
  206. {lock && <Assets name="lock" />}
  207. </div>
  208. <div className="body">
  209. <div className="title">请于{endTime && formatDate(endTime, 'YYYY-MM-DD')}前开通</div>
  210. <div className="btn">
  211. <Button size="lager" width={120} radius onClick={() => onOpen && onOpen()}>
  212. 立即开通
  213. </Button>
  214. </div>
  215. </div>
  216. </Module>
  217. );
  218. }
  219. export function SmallBuyPanel(props) {
  220. const { style, title, lock, onBuy } = props;
  221. return (
  222. <Module style={style} className="panel small-buy-panel">
  223. <div className="header">
  224. <span>{title}</span>
  225. {lock && <Assets name="lock" />}
  226. </div>
  227. <div className="body">
  228. <Assets name="banner_1" />
  229. <Button radius size="small" width={80} onClick={() => onBuy && onBuy()}>
  230. 立即购买
  231. </Button>
  232. </div>
  233. </Module>
  234. );
  235. }