login.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <template>
  2. <view class="mobile-login-page">
  3. <view class="login-top">
  4. <img class="login-logo" :src="systemLogo">
  5. <text class="login-text">
  6. {{systemName}}
  7. </text>
  8. </view>
  9. <view class="login-body">
  10. <view class="input-container">
  11. <uni-icons type="auth" size="30" class="input-icon"></uni-icons>
  12. <input type="text" v-model="userName" placeholder="请输入用户名" class="input-item-1" />
  13. </view>
  14. <view class="input-container">
  15. <uni-icons type="locked" size="30" class="input-icon"></uni-icons>
  16. <input type="password" v-model="password" placeholder="请输入密码" class="input-item-1" />
  17. </view>
  18. <view class="login-change">
  19. <checkbox-group>
  20. <label class="checkbox-zhanghao">
  21. <checkbox value="cb" color="#0550e5" checked="true"/>记住此账号
  22. </label>
  23. </checkbox-group>
  24. <text class="checkbox-zhanghao" @click="forgetPassword"> 忘记密码?</text>
  25. </view>
  26. <button class="login-btn" @click="handleLogin">登录</button>
  27. </view>
  28. </view>
  29. </template>
  30. <script setup>
  31. import CryptoJS from 'crypto-js';
  32. import {toast} from "@/utils/common";
  33. import {onLoad} from "@dcloudio/uni-app";
  34. import {getAppConfig,login} from '@/api/login.js'
  35. import passwordLli from "@/components/password-lli/password-lli.vue";
  36. import JSEncrypt from 'jsencrypt';
  37. import {ref} from 'vue';
  38. const passLLiRef = ref(null)
  39. let systemName = ref('')
  40. let systemLogo = ref('../static/images/login/login-logo-sj.png')
  41. let userName = ref('')
  42. let password = ref('')
  43. let configData = ref(null)
  44. let encryptedPassword = ref(''); // 用于存储加密后的密码
  45. // 密钥和偏移量(IV),需要转换为CryptoJS的WordArray格式
  46. const key = CryptoJS.enc.Utf8.parse('ax58bc32hp54kt68');
  47. const iv = CryptoJS.enc.Utf8.parse('cf46xy53kb64wt25');
  48. // 加密算法:AES/CBC 偏移:PKCS5Padding
  49. function encryptPassword(plainText) {
  50. const ciphertext = CryptoJS.AES.encrypt(plainText, key, {
  51. iv: iv,
  52. mode: CryptoJS.mode.CBC,
  53. padding: CryptoJS.pad.Pkcs7
  54. });
  55. return ciphertext.toString();
  56. }
  57. onLoad(() => {
  58. getLoginInit()
  59. })
  60. function getLoginInit(){
  61. getLoginConfig();
  62. }
  63. function getLoginConfig(){
  64. /* config().then(res => {
  65. // console.log(res.data,'res');
  66. // systemName.value = res.data.name;
  67. // systemLogo.value = res.data.logo;
  68. // configData.value = res.data;
  69. }) */
  70. }
  71. function handleLogin(){
  72. if(userName.value.length ===0){
  73. toast('请输入手机号!')
  74. return
  75. }
  76. if(password.value.length ===0){
  77. toast('请输入密码!')
  78. return
  79. }
  80. encryptedPassword.value = encryptPassword(password.value.trim());
  81. // 去除 userName 两端的空格
  82. const trimmedUserName = userName.value.trim();
  83. let req = {
  84. userName: trimmedUserName,
  85. password: encryptedPassword.value,
  86. }
  87. login(req).then(res => {
  88. // 接口数据记缓存
  89. let obj = JSON.stringify(res.data)
  90. console.log(obj,'obj');
  91. uni.setStorage({
  92. key: 'Mta-Auth',
  93. data: obj
  94. });
  95. // 待补充----判断checked信息,记缓存用户信息
  96. // 待补充根据后台返回值跳转不同页面
  97. if(res.data.modules ==='1'){
  98. // 考试
  99. uni.switchTab({
  100. url: '/pages/index/index'
  101. });
  102. }else{
  103. // 培训
  104. uni.switchTab({
  105. url: '/pages/index/index'
  106. });
  107. }
  108. })
  109. }
  110. function forgetPassword(){
  111. toast('请联系管理员修改密码!');
  112. }
  113. </script>
  114. <style lang="scss" scoped>
  115. .mobile-login-page {
  116. width: 100%;
  117. height: 100%;
  118. background: #FFF;
  119. text-align: center;
  120. position: absolute;
  121. overflow: auto;
  122. .login-top {
  123. height: 540rpx;
  124. background-size: cover;
  125. background-image: url("../static/images/login/login-bj-sj.png");
  126. // logo
  127. }
  128. .login-logo {
  129. width: 266rpx;
  130. max-height: 100rpx;
  131. margin-top: 156rpx;
  132. }
  133. .login-text {
  134. display: block;
  135. font-size: 64rpx;
  136. color: #FFF;
  137. margin: 24rpx 0 0;
  138. font-weight: 700
  139. }
  140. // 登录区域
  141. .login-body {
  142. width: 100%;
  143. padding: 0 60px;
  144. box-sizing: border-box;
  145. margin: 140rpx auto 0;
  146. .input-container {
  147. display: flex;
  148. align-items: center;
  149. /* 垂直对齐 */
  150. position: relative;
  151. height: 100rpx;
  152. border-radius: 50rpx;
  153. background-color: #F7F7F7;
  154. padding: 0;
  155. margin-bottom: 40rpx;
  156. }
  157. .input-icon {
  158. margin-left: 20rpx;
  159. /* 图标和输入框之间的间距 */
  160. color: #999;
  161. }
  162. }
  163. // 输入框
  164. .login-btn {
  165. width: 100%;
  166. height: 100rpx;
  167. margin-top: 60rpx;
  168. font-size: 36rpx;
  169. letter-spacing: 7.2rpx;
  170. background: linear-gradient(0deg, #436aff 0%, #234ff7 100%);
  171. border-radius: 50rpx;
  172. border: 0;
  173. color: #F7F7F7;
  174. line-height: 100rpx;
  175. }
  176. .login-change {
  177. display: flex;
  178. justify-content: space-between;
  179. align-items: center;
  180. .checkbox-zhanghao {
  181. font-size: 24rpx;
  182. color: #565656;
  183. }
  184. }
  185. }
  186. </style>