|
@@ -1,216 +1,220 @@
|
|
|
-import { defineComponent, reactive, ref } from 'vue';
|
|
|
-import styles from '../index.module.less';
|
|
|
-import lockIcon from '../images/lock-icon.png';
|
|
|
-import useIcon from '../images/user-icon.png';
|
|
|
-import openEye from '../images/openEye.png';
|
|
|
-import closeEye from '../images/closeEye.png';
|
|
|
-import {
|
|
|
- useMessage,
|
|
|
- NForm,
|
|
|
- NFormItem,
|
|
|
- NInput,
|
|
|
- NButton,
|
|
|
- NCheckbox
|
|
|
-} from 'naive-ui';
|
|
|
-import { useRoute, useRouter } from 'vue-router';
|
|
|
-import { PageEnum } from '/src/enums/pageEnum';
|
|
|
-import { storage } from '@/utils/storage';
|
|
|
-import { useUserStore } from '/src/store/modules/users';
|
|
|
-
|
|
|
-interface FormState {
|
|
|
- username: string;
|
|
|
- password: string;
|
|
|
- grant_type?: string;
|
|
|
- loginType?: string;
|
|
|
- client_id?: string;
|
|
|
- client_secret?: string;
|
|
|
- clientId?: string;
|
|
|
- clientSecret?: string;
|
|
|
-}
|
|
|
-
|
|
|
-export default defineComponent({
|
|
|
- name: 'codeLogin',
|
|
|
- props: {
|
|
|
- phone: {
|
|
|
- type: String,
|
|
|
- default: ''
|
|
|
- }
|
|
|
- },
|
|
|
- emits: ['changType', 'update:phone'],
|
|
|
- setup(props, { emit }) {
|
|
|
- const router = useRouter();
|
|
|
- // const route = useRoute();
|
|
|
- const formRef = ref();
|
|
|
- const message = useMessage();
|
|
|
- const loading = ref(false);
|
|
|
- // const autoLogin = ref(true);
|
|
|
- // const LOGIN_NAME = PageEnum.BASE_LOGIN_NAME;
|
|
|
- const showPwd = ref(false);
|
|
|
-
|
|
|
- const userStore = useUserStore();
|
|
|
- let formInline = reactive({
|
|
|
- username: '',
|
|
|
- password: '',
|
|
|
- isCaptcha: true
|
|
|
- });
|
|
|
- const formInlineHistory = storage.get('userInfo-teacher');
|
|
|
- if (formInlineHistory) {
|
|
|
- formInline = reactive({ ...JSON.parse(formInlineHistory) });
|
|
|
- }
|
|
|
-
|
|
|
- if (formInline.username) {
|
|
|
- if (formInline.username !== props.phone && props.phone) {
|
|
|
- formInline.username = props.phone;
|
|
|
- } else {
|
|
|
- emit('update:phone', formInline.username);
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (props.phone) {
|
|
|
- formInline.username = props.phone;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const handleSubmit = async () => {
|
|
|
- formRef.value.validate(async (errors: any) => {
|
|
|
- if (!errors) {
|
|
|
- const { username, password } = formInline;
|
|
|
- loading.value = true;
|
|
|
-
|
|
|
- const params: FormState = {
|
|
|
- username,
|
|
|
- password,
|
|
|
- loginType: 'PASSWORD',
|
|
|
- grant_type: 'password',
|
|
|
- client_id: 'cooleshow-teacher',
|
|
|
- client_secret: 'cooleshow-teacher'
|
|
|
- };
|
|
|
-
|
|
|
- try {
|
|
|
- await userStore.login(params);
|
|
|
- message.destroyAll();
|
|
|
- // 判断是否勾选自动登录
|
|
|
- if (formInline.isCaptcha) {
|
|
|
- storage.set('userInfo-teacher', JSON.stringify(formInline));
|
|
|
- } else {
|
|
|
- storage.set(
|
|
|
- 'userInfo-teacher',
|
|
|
- JSON.stringify({ ...formInline, password: '', isCaptcha: true })
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- // route.query?.redirect ||
|
|
|
- const toPath = decodeURIComponent('/' as string);
|
|
|
- console.log(toPath, 'toPath');
|
|
|
- message.success('登录成功,即将进入系统');
|
|
|
- router.replace(toPath);
|
|
|
- // if (route.name === LOGIN_NAME) {
|
|
|
- // router.replace('/');
|
|
|
- // } else router.replace(toPath);
|
|
|
- } catch (e: any) {
|
|
|
- console.log(e, 'e');
|
|
|
- } finally {
|
|
|
- loading.value = false;
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- };
|
|
|
- return () => (
|
|
|
- <div class={styles['view-account-form-wrap']}>
|
|
|
- {/* <div class={styles.formTitle}>
|
|
|
- <div class={styles.dot}></div>
|
|
|
- 酷乐秀课堂乐器
|
|
|
- </div> */}
|
|
|
- <NForm
|
|
|
- ref={formRef}
|
|
|
- label-placement="left"
|
|
|
- size="large"
|
|
|
- model={formInline}>
|
|
|
- <NFormItem
|
|
|
- path="username"
|
|
|
- rule={[
|
|
|
- { required: true, message: '请输入用户名', trigger: 'blur' }
|
|
|
- ]}>
|
|
|
- <NInput
|
|
|
- maxlength={11}
|
|
|
- v-model:value={formInline.username}
|
|
|
- placeholder="请输入用户名"
|
|
|
- onInput={(val: any) => {
|
|
|
- emit('update:phone', val);
|
|
|
- }}>
|
|
|
- {{
|
|
|
- prefix: () => (
|
|
|
- <img src={useIcon} class={styles.prefixIcon} alt="" />
|
|
|
- )
|
|
|
- }}
|
|
|
- </NInput>
|
|
|
- </NFormItem>
|
|
|
- <NFormItem
|
|
|
- path="password"
|
|
|
- rule={[{ required: true, message: '请输入密码', trigger: 'blur' }]}>
|
|
|
- <NInput
|
|
|
- v-model:value={formInline.password}
|
|
|
- type="text"
|
|
|
- showPasswordOn="click"
|
|
|
- placeholder="请输入密码"
|
|
|
- inputProps={{ autocomplete: 'off' }}
|
|
|
- class={[showPwd.value ? '' : styles['no-pwd']]}
|
|
|
- onKeydown={(e: KeyboardEvent) => {
|
|
|
- if (e.code === 'Enter' || e.code === 'NumpadEnter') {
|
|
|
- handleSubmit();
|
|
|
- }
|
|
|
- }}>
|
|
|
- {{
|
|
|
- prefix: () => (
|
|
|
- <img src={lockIcon} class={styles.prefixIcon} alt="" />
|
|
|
- ),
|
|
|
- suffix: () => (
|
|
|
- <img
|
|
|
- src={showPwd.value ? openEye : closeEye}
|
|
|
- class={styles.pwdIcon}
|
|
|
- alt=""
|
|
|
- onClick={() => {
|
|
|
- showPwd.value = !showPwd.value;
|
|
|
- }}
|
|
|
- />
|
|
|
- )
|
|
|
- }}
|
|
|
- </NInput>
|
|
|
- </NFormItem>
|
|
|
- <NFormItem class={styles['default-color']}>
|
|
|
- <div class={[styles['flex'], styles['justify-between']]}>
|
|
|
- <div class={styles['flex-initial']}>
|
|
|
- <NCheckbox v-model:checked={formInline.isCaptcha}>
|
|
|
- 记住密码
|
|
|
- </NCheckbox>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </NFormItem>
|
|
|
- <NFormItem>
|
|
|
- <NButton
|
|
|
- class={styles.submitBtm}
|
|
|
- type="primary"
|
|
|
- onClick={handleSubmit}
|
|
|
- size="large"
|
|
|
- disabled={loading.value}
|
|
|
- loading={loading.value}
|
|
|
- block>
|
|
|
- 立即登录
|
|
|
- </NButton>
|
|
|
- </NFormItem>
|
|
|
- <NFormItem>
|
|
|
- <NButton
|
|
|
- text
|
|
|
- class={styles.forgetBtm}
|
|
|
- onClick={() => {
|
|
|
- emit('changType');
|
|
|
- }}
|
|
|
- size="large"
|
|
|
- block>
|
|
|
- 忘记密码
|
|
|
- </NButton>
|
|
|
- </NFormItem>
|
|
|
- </NForm>
|
|
|
- </div>
|
|
|
- );
|
|
|
- }
|
|
|
-});
|
|
|
+import { defineComponent, reactive, ref } from 'vue';
|
|
|
+import styles from '../index.module.less';
|
|
|
+import lockIcon from '../images/lock-icon.png';
|
|
|
+import useIcon from '../images/user-icon.png';
|
|
|
+import openEye from '../images/openEye.png';
|
|
|
+import closeEye from '../images/closeEye.png';
|
|
|
+import {
|
|
|
+ useMessage,
|
|
|
+ NForm,
|
|
|
+ NFormItem,
|
|
|
+ NInput,
|
|
|
+ NButton,
|
|
|
+ NCheckbox
|
|
|
+} from 'naive-ui';
|
|
|
+import { useRoute, useRouter } from 'vue-router';
|
|
|
+import { PageEnum } from '/src/enums/pageEnum';
|
|
|
+import { storage } from '@/utils/storage';
|
|
|
+import { useUserStore } from '/src/store/modules/users';
|
|
|
+
|
|
|
+interface FormState {
|
|
|
+ username: string;
|
|
|
+ password: string;
|
|
|
+ grant_type?: string;
|
|
|
+ loginType?: string;
|
|
|
+ client_id?: string;
|
|
|
+ client_secret?: string;
|
|
|
+ clientId?: string;
|
|
|
+ clientSecret?: string;
|
|
|
+}
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ name: 'codeLogin',
|
|
|
+ props: {
|
|
|
+ phone: {
|
|
|
+ type: String,
|
|
|
+ default: ''
|
|
|
+ }
|
|
|
+ },
|
|
|
+ emits: ['changType', 'update:phone'],
|
|
|
+ setup(props, { emit }) {
|
|
|
+ const router = useRouter();
|
|
|
+ // const route = useRoute();
|
|
|
+ const formRef = ref();
|
|
|
+ const message = useMessage();
|
|
|
+ const loading = ref(false);
|
|
|
+ // const autoLogin = ref(true);
|
|
|
+ // const LOGIN_NAME = PageEnum.BASE_LOGIN_NAME;
|
|
|
+ const showPwd = ref(false);
|
|
|
+
|
|
|
+ const userStore = useUserStore();
|
|
|
+ let formInline = reactive({
|
|
|
+ username: '',
|
|
|
+ password: '',
|
|
|
+ isCaptcha: false
|
|
|
+ });
|
|
|
+ const formInlineHistory = storage.get('userInfo-teacher');
|
|
|
+ if (formInlineHistory) {
|
|
|
+ formInline = reactive({ ...JSON.parse(formInlineHistory) });
|
|
|
+ }
|
|
|
+
|
|
|
+ if (formInline.username) {
|
|
|
+ if (formInline.username !== props.phone && props.phone) {
|
|
|
+ formInline.username = props.phone;
|
|
|
+ } else {
|
|
|
+ emit('update:phone', formInline.username);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (props.phone) {
|
|
|
+ formInline.username = props.phone;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleSubmit = async () => {
|
|
|
+ formRef.value.validate(async (errors: any) => {
|
|
|
+ if (!errors) {
|
|
|
+ const { username, password } = formInline;
|
|
|
+ loading.value = true;
|
|
|
+
|
|
|
+ const params: FormState = {
|
|
|
+ username,
|
|
|
+ password,
|
|
|
+ loginType: 'PASSWORD',
|
|
|
+ grant_type: 'password',
|
|
|
+ client_id: 'cooleshow-teacher',
|
|
|
+ client_secret: 'cooleshow-teacher'
|
|
|
+ };
|
|
|
+
|
|
|
+ try {
|
|
|
+ await userStore.login(params);
|
|
|
+ message.destroyAll();
|
|
|
+ // 判断是否勾选自动登录
|
|
|
+ if (formInline.isCaptcha) {
|
|
|
+ storage.set('userInfo-teacher', JSON.stringify(formInline));
|
|
|
+ } else {
|
|
|
+ storage.set(
|
|
|
+ 'userInfo-teacher',
|
|
|
+ JSON.stringify({
|
|
|
+ ...formInline,
|
|
|
+ password: '',
|
|
|
+ isCaptcha: false
|
|
|
+ })
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // route.query?.redirect ||
|
|
|
+ const toPath = decodeURIComponent('/' as string);
|
|
|
+ console.log(toPath, 'toPath');
|
|
|
+ message.success('登录成功,即将进入系统');
|
|
|
+ router.replace(toPath);
|
|
|
+ // if (route.name === LOGIN_NAME) {
|
|
|
+ // router.replace('/');
|
|
|
+ // } else router.replace(toPath);
|
|
|
+ } catch (e: any) {
|
|
|
+ console.log(e, 'e');
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+ return () => (
|
|
|
+ <div class={styles['view-account-form-wrap']}>
|
|
|
+ {/* <div class={styles.formTitle}>
|
|
|
+ <div class={styles.dot}></div>
|
|
|
+ 酷乐秀课堂乐器
|
|
|
+ </div> */}
|
|
|
+ <NForm
|
|
|
+ ref={formRef}
|
|
|
+ label-placement="left"
|
|
|
+ size="large"
|
|
|
+ model={formInline}>
|
|
|
+ <NFormItem
|
|
|
+ path="username"
|
|
|
+ rule={[
|
|
|
+ { required: true, message: '请输入用户名', trigger: 'blur' }
|
|
|
+ ]}>
|
|
|
+ <NInput
|
|
|
+ maxlength={11}
|
|
|
+ v-model:value={formInline.username}
|
|
|
+ placeholder="请输入用户名"
|
|
|
+ onInput={(val: any) => {
|
|
|
+ emit('update:phone', val);
|
|
|
+ }}>
|
|
|
+ {{
|
|
|
+ prefix: () => (
|
|
|
+ <img src={useIcon} class={styles.prefixIcon} alt="" />
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </NInput>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem
|
|
|
+ path="password"
|
|
|
+ rule={[{ required: true, message: '请输入密码', trigger: 'blur' }]}>
|
|
|
+ <NInput
|
|
|
+ v-model:value={formInline.password}
|
|
|
+ type="text"
|
|
|
+ showPasswordOn="click"
|
|
|
+ placeholder="请输入密码"
|
|
|
+ inputProps={{ autocomplete: 'off' }}
|
|
|
+ class={[showPwd.value ? '' : styles['no-pwd']]}
|
|
|
+ onKeydown={(e: KeyboardEvent) => {
|
|
|
+ if (e.code === 'Enter' || e.code === 'NumpadEnter') {
|
|
|
+ handleSubmit();
|
|
|
+ }
|
|
|
+ }}>
|
|
|
+ {{
|
|
|
+ prefix: () => (
|
|
|
+ <img src={lockIcon} class={styles.prefixIcon} alt="" />
|
|
|
+ ),
|
|
|
+ suffix: () => (
|
|
|
+ <img
|
|
|
+ src={showPwd.value ? openEye : closeEye}
|
|
|
+ class={styles.pwdIcon}
|
|
|
+ alt=""
|
|
|
+ onClick={() => {
|
|
|
+ showPwd.value = !showPwd.value;
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </NInput>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem class={styles['default-color']}>
|
|
|
+ <div class={[styles['flex'], styles['justify-between']]}>
|
|
|
+ <div class={styles['flex-initial']}>
|
|
|
+ <NCheckbox v-model:checked={formInline.isCaptcha}>
|
|
|
+ 记住密码
|
|
|
+ </NCheckbox>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem>
|
|
|
+ <NButton
|
|
|
+ class={styles.submitBtm}
|
|
|
+ type="primary"
|
|
|
+ onClick={handleSubmit}
|
|
|
+ size="large"
|
|
|
+ disabled={loading.value}
|
|
|
+ loading={loading.value}
|
|
|
+ block>
|
|
|
+ 立即登录
|
|
|
+ </NButton>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem>
|
|
|
+ <NButton
|
|
|
+ text
|
|
|
+ class={styles.forgetBtm}
|
|
|
+ onClick={() => {
|
|
|
+ emit('changType');
|
|
|
+ }}
|
|
|
+ size="large"
|
|
|
+ block>
|
|
|
+ 忘记密码
|
|
|
+ </NButton>
|
|
|
+ </NFormItem>
|
|
|
+ </NForm>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+});
|