record.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import { browser } from '@/helpers/utils';
  2. import { defineComponent, onMounted, reactive } from 'vue';
  3. import styles from './index.module.less';
  4. import MSticky from '@/components/m-sticky';
  5. import MHeader from '@/components/m-header';
  6. import { useRouter } from 'vue-router';
  7. import { postMessage } from '@/helpers/native-message';
  8. import MSearch from '@/components/m-search';
  9. import { Calendar, List } from 'vant';
  10. import dayjs from 'dayjs';
  11. import isBetween from 'dayjs/plugin/isBetween';
  12. import request from '@/helpers/request';
  13. import MEmpty from '@/components/m-empty';
  14. dayjs.extend(isBetween);
  15. import recordItemBg from './images/record-item-bg.png';
  16. const vipGiftPeriodType = {
  17. DAY: '天',
  18. MONTH: '个月',
  19. YEAR: '年'
  20. } as any;
  21. export default defineComponent({
  22. name: 'activationCode',
  23. setup() {
  24. const router = useRouter();
  25. const state = reactive({
  26. showPopoverTime: false,
  27. background: 'transparent',
  28. loading: false,
  29. finished: false,
  30. list: [] as any
  31. });
  32. const forms = reactive({
  33. page: 1,
  34. rows: 20,
  35. status: 'ACTIVATED',
  36. code: null as any,
  37. activateStartTime: dayjs().subtract(1, 'months').format('YYYY-MM-DD'),
  38. activateEndTime: dayjs().format('YYYY-MM-DD')
  39. });
  40. const getList = async () => {
  41. state.loading = true;
  42. try {
  43. const params = {
  44. ...forms
  45. };
  46. if (forms.activateEndTime && forms.activateStartTime) {
  47. params.activateEndTime = forms.activateEndTime + ' 23:59:59';
  48. params.activateStartTime = forms.activateStartTime + ' 00:00:00';
  49. }
  50. const res = await request.post('/edu-app/activationCodeRecord/page', {
  51. data: params
  52. });
  53. if (res.code === 200 && Array.isArray(res?.data?.rows)) {
  54. state.list = [...state.list, ...res.data.rows];
  55. state.finished = !res.data.next;
  56. forms.page = res.data.current + 1;
  57. // state.listState.dataShow = state.list.length > 0;
  58. } else {
  59. state.finished = true;
  60. }
  61. } catch (error) {
  62. // console.log('🚀 ~ error:', error);
  63. state.finished = true;
  64. }
  65. state.loading = false;
  66. };
  67. onMounted(() => {
  68. getList();
  69. });
  70. return () => (
  71. <div
  72. class={[
  73. styles.hotMusicMore,
  74. browser().isTablet ? styles.hotMusicMoreTablet : ''
  75. ]}>
  76. <MSticky position="top">
  77. <MHeader border={false} background={'transparent'}>
  78. {{
  79. content: () => (
  80. <div class={styles.woringHeader}>
  81. <div>
  82. <i
  83. onClick={() => {
  84. if (browser().isApp) {
  85. postMessage({
  86. api: 'goBack'
  87. });
  88. } else {
  89. router.back();
  90. }
  91. }}
  92. class={[
  93. 'van-badge__wrapper van-icon van-icon-arrow-left van-nav-bar__arrow',
  94. styles.leftArrow
  95. ]}></i>
  96. <span class={styles.title2}>
  97. <i></i>
  98. </span>
  99. </div>
  100. </div>
  101. )
  102. }}
  103. </MHeader>
  104. <div class={[styles.activationContainer, styles.recordContainer]}>
  105. <i class={styles.iconBrid}></i>
  106. <div class={styles.section}>
  107. <MSearch
  108. inputBackground="white"
  109. shape="round"
  110. placeholder="请输入激活码"
  111. onSearch={(val: any) => {
  112. forms.code = val;
  113. forms.page = 1;
  114. state.list = [];
  115. state.finished = false;
  116. getList();
  117. }}
  118. />
  119. <div class={styles.prodSection}>
  120. <div class={styles.title}>周期选择</div>
  121. <div
  122. class={[
  123. styles.times,
  124. state.showPopoverTime ? styles.active : ''
  125. ]}
  126. onClick={() => {
  127. state.showPopoverTime = true;
  128. }}>
  129. {dayjs(forms.activateStartTime).format('YYYY-MM-DD')}至
  130. {forms.activateEndTime}
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. </MSticky>
  136. <div class={styles.sectionList}>
  137. <List
  138. loading={state.loading}
  139. finished={state.finished}
  140. finishedText=" "
  141. onLoad={getList}
  142. immediateCheck={false}>
  143. {state.list.length > 0 &&
  144. state.list.map((item: any) => (
  145. <div class={styles.sectionItem}>
  146. <div class={styles.itemTop}>
  147. <div class={styles.itemTitle}>
  148. <img src={recordItemBg} class={styles.recordItemBg} />
  149. <div class={styles.text}>
  150. 乐器AI学练工具{item.times >= 99 && item.type ==='YEAR' ? '永久' : item.times + vipGiftPeriodType[item.type] }
  151. </div>
  152. </div>
  153. <div class={styles.itemCode}>{item.code}</div>
  154. </div>
  155. <div class={styles.itemTime}>
  156. 生效时间:
  157. <span>{item.efficientTime}</span>
  158. </div>
  159. </div>
  160. ))}
  161. </List>
  162. {!state.loading && state.list.length === 0 && (
  163. <div style={{ height: '100%' }}>
  164. <MEmpty description="暂无激活记录~" />
  165. </div>
  166. )}
  167. </div>
  168. <Calendar
  169. v-model:show={state.showPopoverTime}
  170. firstDayOfWeek={1}
  171. safeAreaInsetBottom
  172. type="range"
  173. title="周期选择"
  174. minDate={new Date('2023-02-27')}
  175. defaultDate={[
  176. dayjs(forms.activateStartTime).toDate(),
  177. dayjs(forms.activateEndTime).toDate()
  178. ]}
  179. style={{
  180. height: '70%'
  181. }}
  182. onConfirm={(item: any) => {
  183. forms.activateStartTime = dayjs(item[0]).format('YYYY-MM-DD');
  184. forms.activateEndTime = dayjs(item[1]).format('YYYY-MM-DD');
  185. state.showPopoverTime = false;
  186. forms.page = 1;
  187. state.list = [];
  188. state.finished = false;
  189. getList();
  190. }}
  191. />
  192. </div>
  193. );
  194. }
  195. });