index.tsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import {
  2. defineComponent,
  3. onBeforeUnmount,
  4. reactive,
  5. ref,
  6. onMounted
  7. } from 'vue';
  8. import loginStyles from './images/login_styles.png';
  9. import loginLeft from './images/login-left.png';
  10. import loginRight from './images/loginright.png';
  11. import colLogo from './images/colLogo.png';
  12. import CodeLogin from './components/codeLogin';
  13. import PwdLogin from './components/pwdLogin';
  14. import {
  15. NTabs,
  16. NTabPane,
  17. useDialog,
  18. NModal,
  19. NButton,
  20. NSpace,
  21. NAlert,
  22. NImage
  23. } from 'naive-ui';
  24. import styles from './index.module.less';
  25. import ForgotPassword from './components/forgotPassword';
  26. import moveTop from './images/moveTopBg.png';
  27. import dingPng from './images/ding.png';
  28. import closeAble from './images/closeAble.png';
  29. import infoIcon from './images/infoIcon.png';
  30. import { state } from '/src/state';
  31. export default defineComponent({
  32. name: 'login-page',
  33. setup() {
  34. const isForgot = ref(false);
  35. const NavsValue = ref('pwdLogin');
  36. const pwdLoginRef = ref();
  37. const forgotPasswordRef = ref();
  38. const popEvent = ref();
  39. const dialog = useDialog();
  40. const showModalMask = ref(false);
  41. const checkInstall = async (event: any) => {
  42. event.preventDefault();
  43. console.log('checkInstall', event);
  44. popEvent.value = event;
  45. console.log('beforeoutcome');
  46. // const { outcome } = await event.userChoice;
  47. // console.log(outcome, 'outcome')
  48. // setTimeout(async function () {
  49. // try {
  50. // const { outcome } = await event.userChoice;
  51. // console.log(outcome, 'outcome')
  52. // } catch (e) {
  53. // console.log(e)
  54. // }
  55. // }, 2000)
  56. if (window.matchMedia('(display-mode: standalone)').matches) {
  57. state.application = window.matchMedia(
  58. '(display-mode: standalone)'
  59. ).matches;
  60. console.log('应用内打开');
  61. } else {
  62. console.log(popEvent.value, 'popEvent.value');
  63. if (popEvent.value) {
  64. showModalMask.value = true;
  65. setTimeout(() => {
  66. const btn = document.querySelector('#submitBtn');
  67. console.log(btn);
  68. if (btn) {
  69. btn.addEventListener('click', () => {
  70. showModalMask.value = false;
  71. if (!popEvent.value) {
  72. return;
  73. }
  74. popEvent.value.prompt();
  75. popEvent.value.userChoice.then((choiceResult: any) => {
  76. if (choiceResult.outcome === 'accepted') {
  77. console.log('用户已同意添加到桌面');
  78. showModalMask.value = false;
  79. } else {
  80. console.log('用户已取消添加到桌面');
  81. showModalMask.value = false;
  82. }
  83. });
  84. });
  85. }
  86. }, 500);
  87. }
  88. }
  89. };
  90. window.addEventListener('beforeinstallprompt', checkInstall, {
  91. once: true
  92. });
  93. onBeforeUnmount(() => {
  94. window.removeEventListener('beforeinstallprompt', checkInstall);
  95. });
  96. onMounted(async () => {
  97. // const relatedApps = await navigator?.getInstalledRelatedApps();
  98. //
  99. });
  100. const downChrome = () => {
  101. const agent = navigator.userAgent.toLowerCase();
  102. const isMac = (function () {
  103. return /macintosh|mac os x/i.test(navigator.userAgent);
  104. })();
  105. if (agent.indexOf('win32') >= 0 || agent.indexOf('wow32') >= 0) {
  106. window.open(
  107. 'https://appstore.ks3-cn-beijing.ksyuncs.com/ChromeStandaloneSetup32.exe'
  108. );
  109. }
  110. if (agent.indexOf('win64') >= 0 || agent.indexOf('wow64') >= 0) {
  111. window.open(
  112. 'https://appstore.ks3-cn-beijing.ksyuncs.com/ChromeStandaloneSetup64.exe'
  113. );
  114. }
  115. if (isMac) {
  116. window.open(
  117. 'https://appstore.ks3-cn-beijing.ksyuncs.com/googlechrome-mac.dmg'
  118. );
  119. }
  120. };
  121. return () => (
  122. <div class={styles['view-account']}>
  123. <div class={styles['view-account-container']}>
  124. <img src={loginLeft} class={styles.loginLeft} alt="" />
  125. <img src={loginRight} class={styles.loginRight} alt="" />
  126. <div class={styles['stylesWrap']}>
  127. <img src={loginStyles} alt="" />
  128. </div>
  129. </div>
  130. <div class={styles['view-account-form']}>
  131. <img class={styles.colLogo} src={colLogo}></img>
  132. {isForgot.value ? (
  133. <NTabs
  134. key="forgotPassword"
  135. default-value={NavsValue.value}
  136. class={[styles.loginTabs, styles.loginForgot]}
  137. ref={forgotPasswordRef}
  138. justify-content="center">
  139. <NTabPane name="forgotPassword" tab="重置密码">
  140. <ForgotPassword
  141. onChangType={() => {
  142. isForgot.value = false;
  143. NavsValue.value = 'pwdLogin';
  144. // pwdLoginRef.value.syncBarPosition();
  145. }}></ForgotPassword>
  146. </NTabPane>
  147. </NTabs>
  148. ) : (
  149. <NTabs
  150. key="pwdLogin"
  151. ref={pwdLoginRef}
  152. default-value={NavsValue.value}
  153. class={[styles.loginTabs]}
  154. justify-content="center">
  155. <NTabPane name="pwdLogin" tab="密码登录">
  156. <PwdLogin
  157. onChangType={() => {
  158. isForgot.value = true;
  159. NavsValue.value = 'forgotPassword';
  160. // forgotPasswordRef.value.syncBarPosition();
  161. }}></PwdLogin>
  162. </NTabPane>
  163. <NTabPane name="codeLogin" tab="短信验证">
  164. <CodeLogin></CodeLogin>
  165. </NTabPane>
  166. </NTabs>
  167. )}
  168. <div class={styles.alertWrap}>
  169. <div class={styles.alertInfo}>
  170. <NImage
  171. src={infoIcon}
  172. class={styles.infoIcon}
  173. previewDisabled></NImage>
  174. 为了您更好的上课体验,推荐使用Chrome浏览器
  175. </div>
  176. <div class={styles.down} onClick={downChrome}>
  177. 立即下载
  178. </div>
  179. </div>
  180. </div>
  181. <NModal v-model:show={showModalMask.value}>
  182. {/* <div
  183. onClick={() => {
  184. showModalTone.value = false;
  185. }}>
  186. <NImage
  187. src={toneImage}
  188. previewDisabled
  189. class={styles.beatImage}></NImage>
  190. </div> */}
  191. <div class={styles.downMove}>
  192. <img src={dingPng} class={styles.dingPng} alt="" />
  193. <img src={moveTop} class={styles.downMoveBg} alt="" />
  194. <img
  195. src={closeAble}
  196. class={styles.closeAble}
  197. onClick={() => {
  198. showModalMask.value = false;
  199. }}
  200. alt=""
  201. />
  202. <h2>温馨提示</h2>
  203. <p>
  204. 检测到您尚未安装“音乐数字课堂”应用程序,为了更好的使用体验,是否立即下载?
  205. </p>
  206. {/* <NButton>确定</NButton> */}
  207. <NSpace style={{ padding: '25px 0 0 0' }} justify="center">
  208. <NButton
  209. {...{ id: 'submitBtn' }}
  210. class={styles.submitAppBtn}
  211. round
  212. type="primary">
  213. 立即下载
  214. </NButton>
  215. </NSpace>
  216. </div>
  217. </NModal>
  218. </div>
  219. );
  220. }
  221. });