index.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import { defineComponent } from "vue"
  2. import { ElForm, ElFormItem, ElInput, ElMessage } from "element-plus";
  3. import styles from './index.module.less'
  4. import request from "/src/helpers/request";
  5. import { setToken } from "/src/utils/auth";
  6. export default defineComponent({
  7. data() {
  8. const validateUsername = (rule: any, value: any, callback: () => void) => {
  9. if (!value) {
  10. // @ts-ignore
  11. callback(new Error("请输入用户名"));
  12. } else {
  13. callback();
  14. }
  15. }
  16. const validatePassword = (rule: any, value: string | any[], callback: () => void) => {
  17. if (value.length < 6) {
  18. // @ts-ignore
  19. callback(new Error("密码必须大于六位"));
  20. } else {
  21. callback();
  22. }
  23. }
  24. return {
  25. loginForm: {
  26. username: null,
  27. password: null
  28. } as any,
  29. loginRules: {
  30. username: [
  31. { required: true, trigger: "blur", validator: validateUsername }
  32. ],
  33. password: [
  34. { required: true, trigger: "blur", validator: validatePassword }
  35. ]
  36. },
  37. passwordType: "password",
  38. redirect: undefined,
  39. isSaveUserInfo: true
  40. }
  41. },
  42. mounted() {
  43. this.loginForm.username = localStorage.getItem('username');
  44. this.loginForm.password = localStorage.getItem('password');
  45. },
  46. methods: {
  47. showPwd() {
  48. if (this.passwordType === "password") {
  49. this.passwordType = "";
  50. } else {
  51. this.passwordType = "password";
  52. }
  53. this.$nextTick(() => {
  54. (this as any).$refs.password.focus();
  55. });
  56. },
  57. handleLogin() {
  58. // 判断是否点击了记住密码 => 存储密码
  59. const loginForm = this.loginForm;
  60. if (this.isSaveUserInfo) {
  61. localStorage.setItem('username', loginForm.username);
  62. localStorage.setItem('password', loginForm.password);
  63. } else {
  64. localStorage.setItem('username', '');
  65. localStorage.setItem('password', '');
  66. }
  67. (this as any).$refs.loginForm.validate(async (valid: any) => {
  68. if (valid) {
  69. try {
  70. const res: any = await request.post('/api-auth/usernameLogin', {
  71. data: {
  72. username: loginForm.username,
  73. password: loginForm.password,
  74. clientId: "system",
  75. clientSecret: "system"
  76. }
  77. })
  78. console.log(res, 'res');
  79. let token: string = res?.data.authentication.token_type + ' ' + res?.data.authentication.access_token;
  80. console.log(token);
  81. setToken(token)
  82. ElMessage.success('登录成功')
  83. this.$router.push({ path: "/home" });
  84. console.log(res)
  85. } catch (error) {
  86. // console.log(error)
  87. }
  88. } else {
  89. return false;
  90. }
  91. });
  92. },
  93. saveUserInfo() {
  94. this.isSaveUserInfo = !this.isSaveUserInfo;
  95. }
  96. },
  97. render() {
  98. return (
  99. <div class={styles.loginContainer}>
  100. <div class={styles.loginHeader}>
  101. <div class={styles.logo}>
  102. <img src="/src/assets/home/logo.png" alt="" />
  103. </div>
  104. <i class={styles.line}></i>
  105. <div class={styles.logoName}>乐团管理系统</div>
  106. </div>
  107. <div>
  108. <div class={styles.loginSection}>
  109. <div class={styles.formBg}>
  110. <img src="/src/pages/login/images/from-bg.png" alt="" />
  111. </div>
  112. <ElForm ref="loginForm"
  113. model={this.loginForm}
  114. rules={this.loginRules}
  115. class={styles.loginForm}
  116. auto-complete="on"
  117. label-position="left">
  118. <div class={styles.titleContainer}>登录</div>
  119. <ElFormItem prop="username"
  120. class={styles.logitem}>
  121. <span class={styles.svgContainer}>
  122. {/* <img class={styles.icon} src="/src/icons/svg/user.svg" alt="" /> */}
  123. <SvgIcon class={styles.icon} name="svg-user" color="#fff" />
  124. </span>
  125. <ElInput ref="username"
  126. class={styles.loginInput}
  127. v-model={this.loginForm.username}
  128. placeholder="请输入用户名"
  129. type="text"
  130. tabindex="1"
  131. auto-complete="off" />
  132. </ElFormItem>
  133. <ElFormItem prop="password"
  134. class={styles.logitem}>
  135. <span class={styles.svgContainer}>
  136. {/* <img class={styles.icon} src="/src/icons/svg/password.svg" alt="" /> */}
  137. <SvgIcon class={styles.icon} name="svg-password" color="#fff" />
  138. </span>
  139. <ElInput
  140. ref="password"
  141. class={styles.loginInput}
  142. v-model={this.loginForm.password}
  143. type={this.passwordType}
  144. placeholder="请输入密码"
  145. tabindex="2"
  146. auto-complete="off" />
  147. <span class={styles.showPwd} onClick={this.showPwd}>
  148. {this.passwordType === 'password' ? <SvgIcon class={styles.icon} name="svg-eye" color="#fff" /> : <SvgIcon class={styles.icon} name="svg-eye-open" color="#fff" />}
  149. </span>
  150. </ElFormItem>
  151. <div class={[!this.loginForm.username || !this.loginForm.password ? styles.disabled : '', styles.loginBtn]}
  152. onClick={this.handleLogin}>登录</div>
  153. <div class={styles.remberBox} onClick={() => { this.isSaveUserInfo = !this.isSaveUserInfo }}>
  154. <div class={[this.isSaveUserInfo ? styles.checked : '', styles.dotWrap]}></div>
  155. 记住密码
  156. </div>
  157. </ElForm>
  158. </div>
  159. <div class={styles.footer}>
  160. Copyright © 2022 管乐迷, Inc.ALL Rights Reserved
  161. </div>
  162. </div>
  163. </div>
  164. )
  165. }
  166. })