c293da23
刘淇
新园林init
|
1
2
|
<template>
<view class="login-page">
|
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
115
|
import { useUserStore } from '@/pinia/user';
import globalConfig from '@/common/config/global';
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
116
|
// 全局实例 & 基础状态
|
8ddc6f6e
刘淇
登录 修改样式
|
117
|
const userStore = useUserStore();
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
118
119
120
121
122
123
124
125
126
127
128
129
|
const loginFormRef = ref(null);
const isLoading = ref(false);
// Tabs配置(name直接存储显示文本)
const tabList = ref([
{ name: '手机号登录' },
{ name: '账号登录' }
]);
const loginType = ref('手机号登录'); // 登录类型标识
// 记住密码(默认选中)
const rememberPwd = ref(true);
|
8ddc6f6e
刘淇
登录 修改样式
|
130
|
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
131
|
// 表单数据
|
c293da23
刘淇
新园林init
|
132
|
const form = reactive({
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
133
134
135
|
account: '', // 账号
mobile: '', // 手机号
password: '' // 密码
|
c293da23
刘淇
新园林init
|
136
137
|
});
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
138
|
// 表单校验规则
|
8ddc6f6e
刘淇
登录 修改样式
|
139
|
const loginFormRules = reactive({
|
8ddc6f6e
刘淇
登录 修改样式
|
140
141
142
143
|
account: [
{ type: 'string', required: true, message: '请输入登录账号', trigger: ['change', 'blur'] },
{ type: 'string', min: 2, max: 30, message: '账号长度为2-30个字符', trigger: ['change', 'blur'] }
],
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
144
145
146
147
|
mobile: [
{ type: 'string', required: true, message: '请输入手机号', trigger: ['change', 'blur'] },
{ type: 'string', pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: ['change', 'blur'] }
],
|
8ddc6f6e
刘淇
登录 修改样式
|
148
149
|
password: [
{ type: 'string', required: true, message: '请输入登录密码', trigger: ['change', 'blur'] },
|
12e66ec8
刘淇
新增树
|
150
|
{ type: 'string', min: 3, max: 20, message: '密码长度为3-20个字符', trigger: ['change', 'blur'] }
|
8ddc6f6e
刘淇
登录 修改样式
|
151
|
]
|
c293da23
刘淇
新园林init
|
152
153
|
});
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
// Tabs切换事件
const handleTabChange = ({name}) => {
console.log(name)
if (isLoading.value) return;
loginType.value = name;
// 切换时清空另一类输入框
if (name === '手机号登录') {
form.account = '';
} else {
form.mobile = '';
}
// 清空校验状态
nextTick(() => {
loginFormRef.value?.clearValidate();
});
};
// 生命周期
|
c293da23
刘淇
新园林init
|
174
|
onMounted(() => {
|
37c26bd3
刘淇
巡查计划
|
175
176
|
// 检查登录态
checkLoginStatus();
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
177
178
|
// 初始化表单校验规则
|
8ddc6f6e
刘淇
登录 修改样式
|
179
180
181
|
nextTick(() => {
loginFormRef.value?.setRules(loginFormRules);
});
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
|
// 读取缓存的账号/密码
if (rememberPwd.value) {
try {
const savedAccount = uni.getStorageSync('login_account') || '';
const savedMobile = uni.getStorageSync('login_mobile') || '';
const savedPwd = 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);
}
}
|
37c26bd3
刘淇
巡查计划
|
203
204
|
});
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
205
|
// 检查登录状态
|
37c26bd3
刘淇
巡查计划
|
206
|
const checkLoginStatus = () => {
|
c293da23
刘淇
新园林init
|
207
|
try {
|
c293da23
刘淇
新园林init
|
208
209
|
if (userStore.isLogin) {
uni.switchTab({
|
e6a04285
刘淇
单图情况 宽高70*70
|
210
|
url: '/pages/workbench/index',
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
211
|
fail: () => uni.reLaunch({ url: '/pages/workbench/index' })
|
c293da23
刘淇
新园林init
|
212
|
});
|
c293da23
刘淇
新园林init
|
213
214
215
216
|
}
} catch (err) {
console.warn('检查登录状态失败:', err);
}
|
37c26bd3
刘淇
巡查计划
|
217
|
};
|
c293da23
刘淇
新园林init
|
218
|
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
219
|
// 登录方法
|
c293da23
刘淇
新园林init
|
220
|
const handleLogin = async () => {
|
c293da23
刘淇
新园林init
|
221
|
try {
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
222
|
// 表单校验
|
8ddc6f6e
刘淇
登录 修改样式
|
223
|
await loginFormRef.value.validate();
|
8ddc6f6e
刘淇
登录 修改样式
|
224
|
isLoading.value = true;
|
c293da23
刘淇
新园林init
|
225
|
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
226
227
228
229
230
231
232
233
234
235
236
|
// 组装登录参数
const loginParams = { password: form.password };
if (loginType.value === '手机号登录') {
// loginParams.mobile = form.mobile;
loginParams.username = form.mobile;
} else {
loginParams.username = form.account;
}
// 执行登录
await userStore.login(loginParams);
|
c293da23
刘淇
新园林init
|
237
|
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
|
// 保存记住密码
if (rememberPwd.value) {
try {
if (loginType.value === '手机号登录') {
uni.setStorageSync('login_mobile', form.mobile);
uni.removeStorageSync('login_account');
} else {
uni.setStorageSync('login_account', form.account);
uni.removeStorageSync('login_mobile');
}
uni.setStorageSync('login_password', form.password);
} catch (err) {
console.warn('保存密码失败:', err);
}
} else {
// 清除缓存
uni.removeStorageSync('login_account');
uni.removeStorageSync('login_mobile');
uni.removeStorageSync('login_password');
}
// 登录成功提示+跳转
uni.showToast({ title: '登录成功', icon: 'success', duration: 1000 });
|
c293da23
刘淇
新园林init
|
261
|
setTimeout(() => {
|
c293da23
刘淇
新园林init
|
262
263
|
uni.switchTab({
url: globalConfig.router.tabBarList[1].path,
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
264
|
fail: () => uni.reLaunch({ url: '/pages/workbench/index' })
|
c293da23
刘淇
新园林init
|
265
|
});
|
e6a04285
刘淇
单图情况 宽高70*70
|
266
|
}, 1000);
|
c293da23
刘淇
新园林init
|
267
|
} catch (err) {
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
268
|
// 错误处理
|
8ddc6f6e
刘淇
登录 修改样式
|
269
270
271
|
if (!Array.isArray(err)) {
console.error('登录失败:', err);
uni.showToast({
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
272
|
title: err.msg || '账号或密码错误,请重试',
|
8ddc6f6e
刘淇
登录 修改样式
|
273
|
icon: 'none',
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
274
|
duration: 1000
|
8ddc6f6e
刘淇
登录 修改样式
|
275
276
|
});
}
|
c293da23
刘淇
新园林init
|
277
278
279
280
281
282
283
|
} finally {
isLoading.value = false;
}
};
</script>
<style scoped lang="scss">
|
37c26bd3
刘淇
巡查计划
|
284
|
// 核心布局
|
c293da23
刘淇
新园林init
|
285
286
|
.login-page {
min-height: 100vh;
|
8ddc6f6e
刘淇
登录 修改样式
|
287
|
padding: 0;
|
c293da23
刘淇
新园林init
|
288
|
box-sizing: border-box;
|
8ddc6f6e
刘淇
登录 修改样式
|
289
290
291
|
overflow: hidden;
position: relative;
background: #f5f7fa;
|
37c26bd3
刘淇
巡查计划
|
292
293
|
}
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
294
|
// 顶部样式
|
8ddc6f6e
刘淇
登录 修改样式
|
295
|
.top-title {
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
296
297
|
background: url("https://img.jichengshanshui.com.cn:28207/appimg/bg.jpg") no-repeat;
background-size: 100% 100%;
|
8ddc6f6e
刘淇
登录 修改样式
|
298
|
color: #fff;
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
299
|
padding: 200rpx 0 200rpx 40rpx;
|
8ddc6f6e
刘淇
登录 修改样式
|
300
|
text-align: left;
|
8ddc6f6e
刘淇
登录 修改样式
|
301
302
|
position: relative;
z-index: 1;
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
303
|
|
8ddc6f6e
刘淇
登录 修改样式
|
304
|
.welcome-text {
|
12e66ec8
刘淇
新增树
|
305
|
font-size: 23px;
|
8ddc6f6e
刘淇
登录 修改样式
|
306
307
308
|
display: block;
margin-bottom: 10px;
font-weight: 500;
|
37c26bd3
刘淇
巡查计划
|
309
310
|
}
|
8ddc6f6e
刘淇
登录 修改样式
|
311
312
|
.platform-name {
margin-bottom: 10px;
|
12e66ec8
刘淇
新增树
|
313
|
font-size: 23px;
|
8ddc6f6e
刘淇
登录 修改样式
|
314
315
|
display: block;
opacity: 0.95;
|
37c26bd3
刘淇
巡查计划
|
316
317
318
|
}
}
|
c293da23
刘淇
新园林init
|
319
|
.login-form {
|
8ddc6f6e
刘淇
登录 修改样式
|
320
|
background-color: #fff;
|
12e66ec8
刘淇
新增树
|
321
322
323
324
|
padding: 20px 15px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
margin: -90px 20px 0;
|
37c26bd3
刘淇
巡查计划
|
325
326
|
position: relative;
z-index: 10;
|
8ddc6f6e
刘淇
登录 修改样式
|
327
|
box-sizing: border-box;
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
328
|
}
|
37c26bd3
刘淇
巡查计划
|
329
|
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
330
331
332
333
334
335
336
337
|
// Tabs样式适配
:deep(.u-tabs) {
margin-bottom: 15px;
.u-tabs__content {
height: auto !important;
}
.u-tab-item {
padding: 0 10px;
|
37c26bd3
刘淇
巡查计划
|
338
|
}
|
c293da23
刘淇
新园林init
|
339
340
|
}
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
341
|
// 表单间距
|
8ddc6f6e
刘淇
登录 修改样式
|
342
|
:deep(.u-form-item) {
|
12e66ec8
刘淇
新增树
|
343
|
margin-bottom: 10px;
|
c293da23
刘淇
新园林init
|
344
|
position: relative;
|
8ddc6f6e
刘淇
登录 修改样式
|
345
|
}
|
c293da23
刘淇
新园林init
|
346
|
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
|
// 密码项样式
.password-item {
position: relative;
margin-bottom: 5px !important;
}
// ✅ 核心优化:记住密码完全居右对齐
.remember-wrap {
//text-align: right;
padding: 0; // 移除多余内边距
margin: 10px 0 20px;
:deep(.u-checkbox) {
font-size: 12px;
color: #666;
justify-content: flex-end;
// 移除复选框的默认左边距,确保居右紧凑
margin-left: 0 !important;
.u-checkbox__label {
margin-left: 5px;
}
}
}
|
12e66ec8
刘淇
新增树
|
372
|
// 登录按钮
|
8ddc6f6e
刘淇
登录 修改样式
|
373
|
.login-btn {
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
374
|
margin-top: 10px;
|
8ddc6f6e
刘淇
登录 修改样式
|
375
|
width: 100%;
|
12e66ec8
刘淇
新增树
|
376
377
378
379
|
height: 44px;
line-height: 44px;
border-radius: 4px;
font-size: 16px;
|
12e66ec8
刘淇
新增树
|
380
381
382
|
background: #0A86F4;
box-shadow: 0px 4px 6px 1px rgba(25,94,215,0.5);
border-radius: 23px;
|
c293da23
刘淇
新园林init
|
383
384
|
}
|
cf70629b
刘淇
养护计划 照片 自己写样式
|
385
|
// 版权信息
|
8ddc6f6e
刘淇
登录 修改样式
|
386
387
388
|
.copyright {
width: 100%;
text-align: center;
|
12e66ec8
刘淇
新增树
|
389
|
font-size: 12px;
|
8ddc6f6e
刘淇
登录 修改样式
|
390
391
392
393
|
color: #999;
position: fixed;
bottom: 100px;
}
|
c293da23
刘淇
新园林init
|
394
|
</style>
|