Blame view

pages/login/index.vue 10.7 KB
c293da23   刘淇   新园林init
1
  <template>
24c0bbe7   刘淇   登录账号密码 加密存储
2
    <view class="page-container">
cf70629b   刘淇   养护计划 照片 自己写样式
3
      <!-- 顶部标题区 -->
8ddc6f6e   刘淇   登录 修改样式
4
5
6
7
      <view class="top-title">
        <text class="welcome-text">你好,欢迎光临</text>
        <text class="platform-name">全域智能运营管理平台</text>
      </view>
37c26bd3   刘淇   巡查计划
8
  
cf70629b   刘淇   养护计划 照片 自己写样式
9
      <!-- 登录表单区域 -->
c293da23   刘淇   新园林init
10
      <view class="login-form">
cf70629b   刘淇   养护计划 照片 自己写样式
11
12
13
        <!-- uview-plus的Tabs组件 -->
        <up-tabs
            :list="tabList"
578c1373   刘淇   样式优化
14
15
            line-width="55"
            line-height="2"
cf70629b   刘淇   养护计划 照片 自己写样式
16
            @change="handleTabChange"
578c1373   刘淇   样式优化
17
18
19
20
21
22
23
24
25
            :activeStyle="{
              color: '#3c9cff',
              fontWeight:'500',
              fontSize: '14'
          }"
            :inactiveStyle="{
             color: '#606060',
              fontSize: '14'
          }"
cf70629b   刘淇   养护计划 照片 自己写样式
26
        ></up-tabs>
37c26bd3   刘淇   巡查计划
27
  
cf70629b   刘淇   养护计划 照片 自己写样式
28
        <!-- 表单校验容器 -->
8ddc6f6e   刘淇   登录 修改样式
29
30
31
32
33
34
        <up-form
            label-position="left"
            :model="form"
            ref="loginFormRef"
            labelWidth="0"
        >
cf70629b   刘淇   养护计划 照片 自己写样式
35
36
37
38
39
40
41
42
          <!-- 手机号输入框 -->
          <up-form-item v-if="loginType === '手机号登录'" prop="mobile">
            <up-input
                v-model="form.mobile"
                border="surround"
                clearable
                maxlength="11"
                input-align="left"
578c1373   刘淇   样式优化
43
                fontSize="14px"
cf70629b   刘淇   养护计划 照片 自己写样式
44
45
46
                :disabled="isLoading"
                shape="circle"
                placeholder="请输入手机号"
578c1373   刘淇   样式优化
47
48
                selectionStart="10"
                selectionEnd="10"
cf70629b   刘淇   养护计划 照片 自己写样式
49
50
51
52
53
54
                @blur="() => loginFormRef.validateField('mobile')"
            />
          </up-form-item>
  
          <!-- 账号输入框 -->
          <up-form-item v-else prop="account">
8ddc6f6e   刘淇   登录 修改样式
55
56
57
58
59
60
            <up-input
                v-model="form.account"
                border="surround"
                clearable
                maxlength="30"
                input-align="left"
578c1373   刘淇   样式优化
61
                fontSize="14px"
8ddc6f6e   刘淇   登录 修改样式
62
63
64
                :disabled="isLoading"
                shape="circle"
                placeholder="请输入账户"
8ddc6f6e   刘淇   登录 修改样式
65
66
67
                @blur="() => loginFormRef.validateField('account')"
            />
          </up-form-item>
c293da23   刘淇   新园林init
68
  
cf70629b   刘淇   养护计划 照片 自己写样式
69
          <!-- 密码输入框 -->
8ddc6f6e   刘淇   登录 修改样式
70
71
          <up-form-item
              prop="password"
cf70629b   刘淇   养护计划 照片 自己写样式
72
              class="password-item"
c293da23   刘淇   新园林init
73
          >
8ddc6f6e   刘淇   登录 修改样式
74
75
76
77
78
79
80
81
82
83
            <up-input
                v-model="form.password"
                placeholder="请输入密码"
                maxlength="20"
                border="surround"
                clearable
                input-align="left"
                type="password"
                :disabled="isLoading"
                shape="circle"
8ddc6f6e   刘淇   登录 修改样式
84
85
86
                @blur="() => loginFormRef.validateField('password')"
            />
          </up-form-item>
cf70629b   刘淇   养护计划 照片 自己写样式
87
88
89
90
91
92
93
  
          <!-- 记住密码单独一行,居右显示 -->
          <view class="remember-wrap">
            <up-checkbox
                :customStyle="{marginBottom: '8px'}"
                label="记住密码"
                name="agree"
578c1373   刘淇   样式优化
94
95
96
97
                size="14"
                iconSize="14"
                labelSize="14"
                labelColor="'#3F3F3F'"
cf70629b   刘淇   养护计划 照片 自己写样式
98
99
100
101
102
                usedAlone
                v-model:checked="rememberPwd"
            >
            </up-checkbox>
          </view>
8ddc6f6e   刘淇   登录 修改样式
103
        </up-form>
c293da23   刘淇   新园林init
104
105
106
107
108
109
110
111
  
        <!-- 登录按钮 -->
        <up-button
            class="login-btn"
            type="primary"
            size="large"
            :loading="isLoading"
            @click="handleLogin"
8ddc6f6e   刘淇   登录 修改样式
112
            shape="circle"
c293da23   刘淇   新园林init
113
114
115
116
        >
          登录
        </up-button>
      </view>
8ddc6f6e   刘淇   登录 修改样式
117
118
119
  
      <!-- 版权信息 -->
      <view class="copyright">蓟城山水集团版权所有</view>
c293da23   刘淇   新园林init
120
121
122
123
    </view>
  </template>
  
  <script setup>
8ddc6f6e   刘淇   登录 修改样式
124
  import { ref, reactive, onMounted, nextTick } from 'vue';
c293da23   刘淇   新园林init
125
126
  import { useUserStore } from '@/pinia/user';
  import globalConfig from '@/common/config/global';
24c0bbe7   刘淇   登录账号密码 加密存储
127
128
129
130
131
132
133
134
135
136
  import CryptoJS from 'crypto-js';
  
  // ========== 加密工具函数(建议抽离到 @/utils/encrypt.js) ==========
  // 密钥配置:生产环境建议从后端接口获取,不要硬编码
  const CRYPTO_CONFIG = {
    key: CryptoJS.enc.Utf8.parse('jcsscrypto123abc'), // 16位key(AES-128)
    iv: CryptoJS.enc.Utf8.parse('abc123jcsscrypto'),  // 16位iv
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  };
c293da23   刘淇   新园林init
137
  
24c0bbe7   刘淇   登录账号密码 加密存储
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
  /**
   * AES加密
   * @param {string} text 待加密文本
   * @returns {string} 加密后的字符串
   */
  const aesEncrypt = (text) => {
    if (!text) return '';
    try {
      return CryptoJS.AES.encrypt(text, CRYPTO_CONFIG.key, {
        iv: CRYPTO_CONFIG.iv,
        mode: CRYPTO_CONFIG.mode,
        padding: CRYPTO_CONFIG.padding
      }).toString();
    } catch (err) {
      console.error('AES加密失败:', err);
      return '';
    }
  };
  
  /**
   * AES解密
   * @param {string} encryptedText 加密后的字符串
   * @returns {string} 解密后的原始文本
   */
  const aesDecrypt = (encryptedText) => {
    if (!encryptedText) return '';
    try {
      const decryptObj = CryptoJS.AES.decrypt(encryptedText, CRYPTO_CONFIG.key, {
        iv: CRYPTO_CONFIG.iv,
        mode: CRYPTO_CONFIG.mode,
        padding: CRYPTO_CONFIG.padding
      });
      return decryptObj.toString(CryptoJS.enc.Utf8);
    } catch (err) {
      console.error('AES解密失败:', err);
      return '';
    }
  };
  
  // ========== 业务逻辑 ==========
8ddc6f6e   刘淇   登录 修改样式
178
  const userStore = useUserStore();
cf70629b   刘淇   养护计划 照片 自己写样式
179
180
181
  const loginFormRef = ref(null);
  const isLoading = ref(false);
  
24c0bbe7   刘淇   登录账号密码 加密存储
182
  // Tabs配置
cf70629b   刘淇   养护计划 照片 自己写样式
183
184
185
186
  const tabList = ref([
    { name: '手机号登录' },
    { name: '账号登录' }
  ]);
24c0bbe7   刘淇   登录账号密码 加密存储
187
  const loginType = ref('手机号登录');
cf70629b   刘淇   养护计划 照片 自己写样式
188
  
24c0bbe7   刘淇   登录账号密码 加密存储
189
  // 记住密码
cf70629b   刘淇   养护计划 照片 自己写样式
190
  const rememberPwd = ref(true);
8ddc6f6e   刘淇   登录 修改样式
191
  
cf70629b   刘淇   养护计划 照片 自己写样式
192
  // 表单数据
c293da23   刘淇   新园林init
193
  const form = reactive({
24c0bbe7   刘淇   登录账号密码 加密存储
194
195
196
    account: '',
    mobile: '',
    password: ''
c293da23   刘淇   新园林init
197
198
  });
  
cf70629b   刘淇   养护计划 照片 自己写样式
199
  // 表单校验规则
8ddc6f6e   刘淇   登录 修改样式
200
  const loginFormRules = reactive({
8ddc6f6e   刘淇   登录 修改样式
201
202
203
204
    account: [
      { type: 'string', required: true, message: '请输入登录账号', trigger: ['change', 'blur'] },
      { type: 'string', min: 2, max: 30, message: '账号长度为2-30个字符', trigger: ['change', 'blur'] }
    ],
cf70629b   刘淇   养护计划 照片 自己写样式
205
206
207
208
    mobile: [
      { type: 'string', required: true, message: '请输入手机号', trigger: ['change', 'blur'] },
      { type: 'string', pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: ['change', 'blur'] }
    ],
8ddc6f6e   刘淇   登录 修改样式
209
210
    password: [
      { type: 'string', required: true, message: '请输入登录密码', trigger: ['change', 'blur'] },
12e66ec8   刘淇   新增树
211
      { type: 'string', min: 3, max: 20, message: '密码长度为3-20个字符', trigger: ['change', 'blur'] }
8ddc6f6e   刘淇   登录 修改样式
212
    ]
c293da23   刘淇   新园林init
213
214
  });
  
cf70629b   刘淇   养护计划 照片 自己写样式
215
  // Tabs切换事件
24c0bbe7   刘淇   登录账号密码 加密存储
216
  const handleTabChange = ({ name }) => {
cf70629b   刘淇   养护计划 照片 自己写样式
217
218
    if (isLoading.value) return;
    loginType.value = name;
cf70629b   刘淇   养护计划 照片 自己写样式
219
220
221
222
223
    if (name === '手机号登录') {
      form.account = '';
    } else {
      form.mobile = '';
    }
cf70629b   刘淇   养护计划 照片 自己写样式
224
225
226
227
228
    nextTick(() => {
      loginFormRef.value?.clearValidate();
    });
  };
  
cf70629b   刘淇   养护计划 照片 自己写样式
229
  // 检查登录状态
37c26bd3   刘淇   巡查计划
230
  const checkLoginStatus = () => {
c293da23   刘淇   新园林init
231
    try {
c293da23   刘淇   新园林init
232
233
      if (userStore.isLogin) {
        uni.switchTab({
e6a04285   刘淇   单图情况 宽高70*70
234
          url: '/pages/workbench/index',
cf70629b   刘淇   养护计划 照片 自己写样式
235
          fail: () => uni.reLaunch({ url: '/pages/workbench/index' })
c293da23   刘淇   新园林init
236
        });
c293da23   刘淇   新园林init
237
238
      }
    } catch (err) {
24c0bbe7   刘淇   登录账号密码 加密存储
239
      console.warn('检查登录状态失败:', err);
c293da23   刘淇   新园林init
240
    }
37c26bd3   刘淇   巡查计划
241
  };
c293da23   刘淇   新园林init
242
  
cf70629b   刘淇   养护计划 照片 自己写样式
243
  // 登录方法
c293da23   刘淇   新园林init
244
  const handleLogin = async () => {
c293da23   刘淇   新园林init
245
    try {
8ddc6f6e   刘淇   登录 修改样式
246
      await loginFormRef.value.validate();
8ddc6f6e   刘淇   登录 修改样式
247
      isLoading.value = true;
c293da23   刘淇   新园林init
248
  
cf70629b   刘淇   养护计划 照片 自己写样式
249
250
251
      // 组装登录参数
      const loginParams = { password: form.password };
      if (loginType.value === '手机号登录') {
cf70629b   刘淇   养护计划 照片 自己写样式
252
253
254
255
256
257
258
        loginParams.username = form.mobile;
      } else {
        loginParams.username = form.account;
      }
  
      // 执行登录
      await userStore.login(loginParams);
c293da23   刘淇   新园林init
259
  
24c0bbe7   刘淇   登录账号密码 加密存储
260
      // 保存数据:账号/密码 均用AES加密
cf70629b   刘淇   养护计划 照片 自己写样式
261
262
263
      if (rememberPwd.value) {
        try {
          if (loginType.value === '手机号登录') {
24c0bbe7   刘淇   登录账号密码 加密存储
264
            uni.setStorageSync('login_mobile', aesEncrypt(form.mobile));
cf70629b   刘淇   养护计划 照片 自己写样式
265
266
            uni.removeStorageSync('login_account');
          } else {
24c0bbe7   刘淇   登录账号密码 加密存储
267
            uni.setStorageSync('login_account', aesEncrypt(form.account));
cf70629b   刘淇   养护计划 照片 自己写样式
268
269
            uni.removeStorageSync('login_mobile');
          }
24c0bbe7   刘淇   登录账号密码 加密存储
270
271
          // 密码加密存储(可解密还原)
          uni.setStorageSync('login_password', aesEncrypt(form.password));
cf70629b   刘淇   养护计划 照片 自己写样式
272
        } catch (err) {
24c0bbe7   刘淇   登录账号密码 加密存储
273
          console.warn('保存登录信息失败:', err);
cf70629b   刘淇   养护计划 照片 自己写样式
274
275
276
277
278
279
280
281
        }
      } else {
        // 清除缓存
        uni.removeStorageSync('login_account');
        uni.removeStorageSync('login_mobile');
        uni.removeStorageSync('login_password');
      }
  
24c0bbe7   刘淇   登录账号密码 加密存储
282
      // 登录成功跳转
cf70629b   刘淇   养护计划 照片 自己写样式
283
      uni.showToast({ title: '登录成功', icon: 'success', duration: 1000 });
c293da23   刘淇   新园林init
284
      setTimeout(() => {
c293da23   刘淇   新园林init
285
286
        uni.switchTab({
          url: globalConfig.router.tabBarList[1].path,
cf70629b   刘淇   养护计划 照片 自己写样式
287
          fail: () => uni.reLaunch({ url: '/pages/workbench/index' })
c293da23   刘淇   新园林init
288
        });
e6a04285   刘淇   单图情况 宽高70*70
289
      }, 1000);
c293da23   刘淇   新园林init
290
    } catch (err) {
8ddc6f6e   刘淇   登录 修改样式
291
      if (!Array.isArray(err)) {
24c0bbe7   刘淇   登录账号密码 加密存储
292
        console.error('登录失败:', err);
8ddc6f6e   刘淇   登录 修改样式
293
        uni.showToast({
cf70629b   刘淇   养护计划 照片 自己写样式
294
          title: err.msg || '账号或密码错误,请重试',
8ddc6f6e   刘淇   登录 修改样式
295
          icon: 'none',
cf70629b   刘淇   养护计划 照片 自己写样式
296
          duration: 1000
8ddc6f6e   刘淇   登录 修改样式
297
298
        });
      }
c293da23   刘淇   新园林init
299
300
301
302
    } finally {
      isLoading.value = false;
    }
  };
24c0bbe7   刘淇   登录账号密码 加密存储
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
  
  // 生命周期
  onMounted(() => {
    checkLoginStatus();
    // 初始化表单规则
    nextTick(() => {
      loginFormRef.value?.setRules(loginFormRules);
    });
    // 读取缓存并解密填充
    if (rememberPwd.value) {
      try {
        const savedAccount = aesDecrypt(uni.getStorageSync('login_account') || '');
        const savedMobile = aesDecrypt(uni.getStorageSync('login_mobile') || '');
        const savedPwd = aesDecrypt(uni.getStorageSync('login_password') || '');
  
        if (savedAccount) {
          form.account = savedAccount;
          loginType.value = '账号登录';
        } else if (savedMobile) {
          form.mobile = savedMobile;
          loginType.value = '手机号登录';
        }
        // 密码解密后填充到输入框(可展示)
        form.password = savedPwd;
      } catch (err) {
        console.warn('读取缓存失败:', err);
      }
    }
  });
c293da23   刘淇   新园林init
332
333
334
  </script>
  
  <style scoped lang="scss">
37c26bd3   刘淇   巡查计划
335
  
8ddc6f6e   刘淇   登录 修改样式
336
  .top-title {
cf70629b   刘淇   养护计划 照片 自己写样式
337
338
    background: url("https://img.jichengshanshui.com.cn:28207/appimg/bg.jpg") no-repeat;
    background-size: 100% 100%;
8ddc6f6e   刘淇   登录 修改样式
339
    color: #fff;
cf70629b   刘淇   养护计划 照片 自己写样式
340
    padding: 200rpx 0 200rpx 40rpx;
8ddc6f6e   刘淇   登录 修改样式
341
    text-align: left;
8ddc6f6e   刘淇   登录 修改样式
342
343
    position: relative;
    z-index: 1;
cf70629b   刘淇   养护计划 照片 自己写样式
344
  
8ddc6f6e   刘淇   登录 修改样式
345
    .welcome-text {
578c1373   刘淇   样式优化
346
      font-size: 20px;
8ddc6f6e   刘淇   登录 修改样式
347
348
      display: block;
      margin-bottom: 10px;
37c26bd3   刘淇   巡查计划
349
350
    }
  
8ddc6f6e   刘淇   登录 修改样式
351
352
    .platform-name {
      margin-bottom: 10px;
578c1373   刘淇   样式优化
353
      font-size: 20px;
8ddc6f6e   刘淇   登录 修改样式
354
      display: block;
37c26bd3   刘淇   巡查计划
355
356
357
    }
  }
  
c293da23   刘淇   新园林init
358
  .login-form {
8ddc6f6e   刘淇   登录 修改样式
359
    background-color: #fff;
12e66ec8   刘淇   新增树
360
361
362
363
    padding: 20px 15px;
    border-radius: 8px;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
    margin: -90px 20px 0;
37c26bd3   刘淇   巡查计划
364
365
    position: relative;
    z-index: 10;
8ddc6f6e   刘淇   登录 修改样式
366
    box-sizing: border-box;
cf70629b   刘淇   养护计划 照片 自己写样式
367
  }
37c26bd3   刘淇   巡查计划
368
  
cf70629b   刘淇   养护计划 照片 自己写样式
369
370
371
372
373
374
375
  :deep(.u-tabs) {
    margin-bottom: 15px;
    .u-tabs__content {
      height: auto !important;
    }
    .u-tab-item {
      padding: 0 10px;
37c26bd3   刘淇   巡查计划
376
    }
c293da23   刘淇   新园林init
377
378
  }
  
8ddc6f6e   刘淇   登录 修改样式
379
  :deep(.u-form-item) {
12e66ec8   刘淇   新增树
380
    margin-bottom: 10px;
c293da23   刘淇   新园林init
381
    position: relative;
8ddc6f6e   刘淇   登录 修改样式
382
  }
c293da23   刘淇   新园林init
383
  
cf70629b   刘淇   养护计划 照片 自己写样式
384
385
386
387
388
  .password-item {
    position: relative;
    margin-bottom: 5px !important;
  }
  
cf70629b   刘淇   养护计划 照片 自己写样式
389
  .remember-wrap {
24c0bbe7   刘淇   登录账号密码 加密存储
390
    padding: 0;
cf70629b   刘淇   养护计划 照片 自己写样式
391
392
393
394
395
396
    margin: 10px 0 20px;
  
    :deep(.u-checkbox) {
      font-size: 12px;
      color: #666;
      justify-content: flex-end;
cf70629b   刘淇   养护计划 照片 自己写样式
397
398
399
400
401
402
403
404
      margin-left: 0 !important;
  
      .u-checkbox__label {
        margin-left: 5px;
      }
    }
  }
  
8ddc6f6e   刘淇   登录 修改样式
405
  .login-btn {
cf70629b   刘淇   养护计划 照片 自己写样式
406
    margin-top: 10px;
8ddc6f6e   刘淇   登录 修改样式
407
    width: 100%;
12e66ec8   刘淇   新增树
408
409
410
    height: 44px;
    line-height: 44px;
    border-radius: 4px;
578c1373   刘淇   样式优化
411
    font-size: 18px;
12e66ec8   刘淇   新增树
412
413
414
    background: #0A86F4;
    box-shadow: 0px 4px 6px 1px rgba(25,94,215,0.5);
    border-radius: 23px;
c293da23   刘淇   新园林init
415
416
  }
  
8ddc6f6e   刘淇   登录 修改样式
417
418
419
  .copyright {
    width: 100%;
    text-align: center;
12e66ec8   刘淇   新增树
420
    font-size: 12px;
8ddc6f6e   刘淇   登录 修改样式
421
422
423
424
    color: #999;
    position: fixed;
    bottom: 100px;
  }
c293da23   刘淇   新园林init
425
  </style>