Blame view

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