record.tsx 6.3 KB

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