index.tsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import { browser } from '@/helpers/utils';
  2. import { defineComponent, 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 { postMessage } from '@/helpers/native-message';
  7. import { useRouter } from 'vue-router';
  8. import { Button, Field, Popup, showToast } from 'vant';
  9. import iconKey from './images/icon-key.png';
  10. import num1 from './images/num1.png'
  11. import num2 from './images/num2.png'
  12. import num3 from './images/num3.png'
  13. import num4 from './images/num4.png'
  14. import CodeDialog from './modal/code-dialog';
  15. import request from '@/helpers/request';
  16. import dayjs from 'dayjs';
  17. const vipGiftPeriodType = {
  18. DAY: '天',
  19. MONTH: '个月',
  20. YEAR: '年'
  21. } as any;
  22. export default defineComponent({
  23. name: 'activationCode',
  24. setup() {
  25. const router = useRouter();
  26. const state = reactive({
  27. showPopup: false,
  28. reslutPopupType: '',
  29. resultPopupContent: '',
  30. loading: false,
  31. activeCodeRecordCode: null as any,
  32. successInfo: {} as any
  33. });
  34. const onSubmit = async () => {
  35. if (!state.activeCodeRecordCode) {
  36. showToast('请输入激活码');
  37. return;
  38. }
  39. state.loading = true;
  40. try {
  41. const res = await request.post(
  42. '/edu-app/activationCodeRecord/useActiveCode',
  43. {
  44. data: {
  45. activeCodeRecordCode: state.activeCodeRecordCode
  46. }
  47. }
  48. );
  49. if (res.code !== 200) {
  50. if (res.code === 980) {
  51. // 980:激活码不存在
  52. state.showPopup = true;
  53. state.reslutPopupType = 'INVALID';
  54. state.resultPopupContent = res.message;
  55. } else if (res.code === 981) {
  56. // 981:激活码被同一人重复使用
  57. state.showPopup = true;
  58. state.reslutPopupType = 'ACTIVATED-TWO';
  59. state.resultPopupContent = res.message;
  60. } else if (res.code === 982) {
  61. // 982:激活码已激活
  62. state.showPopup = true;
  63. state.reslutPopupType = 'EXPIRED';
  64. state.resultPopupContent = res.message;
  65. } else if (res.code === 983) {
  66. // 983:激活码已作废
  67. state.showPopup = true;
  68. state.reslutPopupType = 'OVERDUE';
  69. state.resultPopupContent = res.message;
  70. } else if (res.code === 984) {
  71. // 984:激活码已过期
  72. state.showPopup = true;
  73. state.reslutPopupType = 'CANCELLED';
  74. state.resultPopupContent = res.message;
  75. } else if (res.code === 5442 || res.code === 5443) {
  76. state.showPopup = true;
  77. state.reslutPopupType = 'EXPIRED';
  78. state.resultPopupContent = res.message;
  79. }
  80. } else {
  81. state.showPopup = true;
  82. state.reslutPopupType = 'ACTIVATED';
  83. state.successInfo = res.data;
  84. }
  85. } catch {}
  86. state.loading = false;
  87. };
  88. return () => (
  89. <div
  90. class={[
  91. styles.hotMusicMore,
  92. browser().isTablet ? styles.hotMusicMoreTablet : ''
  93. ]}>
  94. <MSticky position="top">
  95. <MHeader border={false} background={'transparent'}>
  96. {{
  97. content: () => (
  98. <div class={styles.woringHeader}>
  99. <div>
  100. <i
  101. onClick={() => {
  102. if (browser().isApp) {
  103. postMessage({
  104. api: 'goBack'
  105. });
  106. } else {
  107. router.back();
  108. }
  109. }}
  110. class={[
  111. 'van-badge__wrapper van-icon van-icon-arrow-left van-nav-bar__arrow',
  112. styles.leftArrow
  113. ]}></i>
  114. <span class={styles.title}>
  115. <i></i>
  116. </span>
  117. </div>
  118. <div
  119. class={styles.recordBtn}
  120. onClick={() => {
  121. router.push('/activationRecord');
  122. }}>
  123. <i class={styles.iconBook}></i>
  124. 激活记录
  125. </div>
  126. </div>
  127. )
  128. }}
  129. </MHeader>
  130. </MSticky>
  131. <div class={styles.activationContainer}>
  132. <i class={styles.iconBrid}></i>
  133. <div class={styles.section}>
  134. <div class={styles.activationContent}>
  135. <div class={styles.inputGroup}>
  136. <Field
  137. class={styles.input}
  138. leftIcon={iconKey}
  139. v-model={state.activeCodeRecordCode}
  140. placeholder="请输入您的激活码"
  141. clearable
  142. />
  143. <div class={styles.btnGroup}>
  144. <Button
  145. round
  146. block
  147. loading={state.loading}
  148. disabled={state.loading}
  149. onClick={() => {
  150. onSubmit();
  151. }}
  152. color="linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)">
  153. 激活
  154. </Button>
  155. </div>
  156. </div>
  157. <div class={styles.tipCotnent}>
  158. <h2>激活码使用须知:</h2>
  159. <div class={styles.tips}>
  160. <p>
  161. <img src={num1} class={styles.num} />
  162. 激活码只可使用一次,不能重复使用;
  163. </p>
  164. <p>
  165. <img src={num2} class={styles.num} />
  166. 为确保安全,请勿将激活码泄露,以免造成不必要的损失;
  167. </p>
  168. <p>
  169. <img src={num3} class={styles.num} />
  170. 激活码请尽快激活使用,避免激活码过期;
  171. </p>
  172. <p>
  173. <img src={num4} class={styles.num} />
  174. 激活码内容以实际购买页面内容为准。
  175. </p>
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. <Popup
  182. show={state.showPopup}
  183. style={{
  184. background: 'transparent',
  185. overflow: 'visible !important'
  186. }}>
  187. <CodeDialog
  188. type={state.reslutPopupType as any}
  189. onConfirm={() => {
  190. state.showPopup = false;
  191. }}>
  192. {state.reslutPopupType === 'ACTIVATED' && (
  193. <p>
  194. 您已成功激活{state.successInfo?.times}
  195. {vipGiftPeriodType[state.successInfo?.type]}
  196. 乐器AI学练工具,有效期至
  197. <span style={{ color: '#2B85FF' }}>
  198. {dayjs(state.successInfo.membershipEndTime).format(
  199. 'YYYY-MM-DD'
  200. )}
  201. </span>
  202. </p>
  203. )}
  204. {[
  205. 'INVALID',
  206. 'EXPIRED',
  207. 'CANCELLED',
  208. 'OVERDUE',
  209. 'ACTIVATED-TWO'
  210. ].includes(state.reslutPopupType) && (
  211. <p style={{ textAlign: 'center', paddingTop: '5px' }}>
  212. {state.resultPopupContent}
  213. </p>
  214. )}
  215. </CodeDialog>
  216. </Popup>
  217. </div>
  218. );
  219. }
  220. });