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>
|