Blame view

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