record.tsx 6.3 KB

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