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