Blame view

pages/login/index.vue 6.98 KB
c293da23   刘淇   新园林init
1
2
  <template>
    <view class="login-page">
37c26bd3   刘淇   巡查计划
3
4
5
6
      <!-- 纯CSS渐变动效背景(替代粒子动画,兼容所有版本) -->
      <view class="bg-animation"></view>
  
      <!-- 登录表单区域(悬浮层) -->
c293da23   刘淇   新园林init
7
      <view class="login-form">
37c26bd3   刘淇   巡查计划
8
9
10
        <!-- 登录标题(简约大气) -->
        <view class="login-title">园林登录</view>
  
c293da23   刘淇   新园林init
11
12
13
14
15
16
17
        <!-- 账号输入框 -->
        <view class="form-item">
          <up-input
              v-model="form.account"
              placeholder="请输入登录账号"
              border="surround"
              clearable
d768bdcf   刘淇   删除和压缩图片
18
              maxlength="30"
c293da23   刘淇   新园林init
19
20
21
              input-align="left"
              :disabled="isLoading"
              @blur="checkAccount"
37c26bd3   刘淇   巡查计划
22
23
24
25
              :custom-style="{
              backgroundColor: 'rgba(255, 255, 255, 0.9)',
              borderColor: '#e5e7eb'
            }"
c293da23   刘淇   新园林init
26
27
          >
            <template #prefix>
37c26bd3   刘淇   巡查计划
28
              <up-icon name="account" color="#6b7280" size="20"></up-icon>
c293da23   刘淇   新园林init
29
30
31
32
33
34
35
36
37
38
39
            </template>
          </up-input>
          <!-- 账号错误提示 -->
          <view class="error-tip" v-if="error.account">{{ error.account }}</view>
        </view>
  
        <!-- 密码输入框(移除查看密码功能) -->
        <view class="form-item">
          <up-input
              v-model="form.password"
              placeholder="请输入登录密码"
d768bdcf   刘淇   删除和压缩图片
40
              maxlength="20"
c293da23   刘淇   新园林init
41
42
43
44
45
46
              border="surround"
              clearable
              input-align="left"
              type="password"
              :disabled="isLoading"
              @blur="checkPassword"
37c26bd3   刘淇   巡查计划
47
48
49
50
              :custom-style="{
              backgroundColor: 'rgba(255, 255, 255, 0.9)',
              borderColor: '#e5e7eb'
            }"
c293da23   刘淇   新园林init
51
52
          >
            <template #prefix>
37c26bd3   刘淇   巡查计划
53
              <up-icon name="lock" color="#6b7280" size="20"></up-icon>
c293da23   刘淇   新园林init
54
55
56
57
58
59
60
61
62
63
64
65
66
            </template>
          </up-input>
          <!-- 密码错误提示 -->
          <view class="error-tip" v-if="error.password">{{ error.password }}</view>
        </view>
  
        <!-- 登录按钮 -->
        <up-button
            class="login-btn"
            type="primary"
            size="large"
            :loading="isLoading"
            @click="handleLogin"
37c26bd3   刘淇   巡查计划
67
            :custom-style="{
d768bdcf   刘淇   删除和压缩图片
68
  
37c26bd3   刘淇   巡查计划
69
          }"
c293da23   刘淇   新园林init
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
        >
          登录
        </up-button>
      </view>
    </view>
  </template>
  
  <script setup>
  import { ref, reactive, onMounted } from 'vue';
  import { useUserStore } from '@/pinia/user';
  import globalConfig from '@/common/config/global';
  
  // 表单数据
  const form = reactive({
    account: '', // 账号
    password: '' // 密码
  });
  
  // 状态管理
  const isLoading = ref(false);
  const error = reactive({
    account: '',
    password: ''
  });
  
  // 实例化 Pinia 用户仓库
  const userStore = useUserStore();
  
37c26bd3   刘淇   巡查计划
98
  // 页面加载时初始化
c293da23   刘淇   新园林init
99
  onMounted(() => {
37c26bd3   刘淇   巡查计划
100
101
102
103
104
105
    // 检查登录态
    checkLoginStatus();
  });
  
  // 检查登录状态
  const checkLoginStatus = () => {
c293da23   刘淇   新园林init
106
107
108
109
    try {
      // 已登录则直接跳首页
      if (userStore.isLogin) {
        uni.switchTab({
e6a04285   刘淇   单图情况 宽高70*70
110
          url: '/pages/workbench/index',
c293da23   刘淇   新园林init
111
112
          fail: () => {
            // 非tabBar页面用redirectTo
e6a04285   刘淇   单图情况 宽高70*70
113
            uni.reLaunch({ url: '/pages/workbench/index' });
c293da23   刘淇   新园林init
114
115
116
117
118
119
120
          }
        });
        return;
      }
    } catch (err) {
      console.warn('检查登录状态失败:', err);
    }
37c26bd3   刘淇   巡查计划
121
  };
c293da23   刘淇   新园林init
122
123
124
125
126
  
  // 校验账号
  const checkAccount = () => {
    if (!form.account) {
      error.account = '请输入登录账号';
c293da23   刘淇   新园林init
127
128
129
130
131
132
133
134
135
    } else {
      error.account = '';
    }
  };
  
  // 校验密码
  const checkPassword = () => {
    if (!form.password) {
      error.password = '请输入登录密码';
c293da23   刘淇   新园林init
136
137
138
139
140
141
142
143
144
145
146
147
    } else {
      error.password = '';
    }
  };
  
  // 表单整体校验
  const validateForm = () => {
    checkAccount();
    checkPassword();
    return !error.account && !error.password;
  };
  
37c26bd3   刘淇   巡查计划
148
  // 登录处理
c293da23   刘淇   新园林init
149
150
151
152
153
154
155
156
157
158
159
  const handleLogin = async () => {
    if (!validateForm()) return;
  
    isLoading.value = true;
  
    try {
      await userStore.login({
        username: form.account,
        password: form.password
      });
  
e6a04285   刘淇   单图情况 宽高70*70
160
      uni.showToast({ title: '登录成功', icon: 'success', duration: 1000 });
c293da23   刘淇   新园林init
161
  
37c26bd3   刘淇   巡查计划
162
      // 登录成功后跳转首页
c293da23   刘淇   新园林init
163
      setTimeout(() => {
c293da23   刘淇   新园林init
164
165
166
167
        uni.switchTab({
          url: globalConfig.router.tabBarList[1].path,
          fail: (err) => {
            console.warn('tabBar跳转失败,切换为普通跳转:', err);
e6a04285   刘淇   单图情况 宽高70*70
168
            uni.reLaunch({ url: '/pages/workbench/index' });
c293da23   刘淇   新园林init
169
170
          }
        });
e6a04285   刘淇   单图情况 宽高70*70
171
      }, 1000);
c293da23   刘淇   新园林init
172
173
    } catch (err) {
      console.error('登录失败详情:', err);
37c26bd3   刘淇   巡查计划
174
175
176
177
      const errorMsg =
          err.message === '网络异常,请稍后重试'
              ? '网络异常,请稍后重试'
              : err.message || '登录失败,请检查账号密码';
c293da23   刘淇   新园林init
178
179
180
181
182
183
184
185
186
187
188
189
      uni.showToast({
        title: errorMsg,
        icon: 'none',
        duration: 2000
      });
    } finally {
      isLoading.value = false;
    }
  };
  </script>
  
  <style scoped lang="scss">
37c26bd3   刘淇   巡查计划
190
  // 核心布局
c293da23   刘淇   新园林init
191
192
  .login-page {
    min-height: 100vh;
37c26bd3   刘淇   巡查计划
193
    position: relative;
c293da23   刘淇   新园林init
194
195
    padding: 40rpx 30rpx;
    box-sizing: border-box;
37c26bd3   刘淇   巡查计划
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
    overflow: hidden; // 隐藏动效溢出
  
    // 适配小程序安全区
    /* #ifdef MP-WEIXIN */
    padding-bottom: constant(safe-area-inset-bottom);
    padding-bottom: env(safe-area-inset-bottom);
    /* #endif */
  }
  
  // 纯CSS渐变动效背景(替代粒子,兼容所有版本)
  .bg-animation {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 0;
    // 基础渐变底色
    background: linear-gradient(120deg, #f0f9ff 0%, #e6f7ff 100%);
    // 伪粒子动效(多个透明渐变圆缓慢移动)
    &::before,
    &::after {
      content: '';
      position: absolute;
      border-radius: 50%;
      background: rgba(59, 130, 246, 0.05);
      animation: float 20s infinite linear;
    }
  
    &::before {
      width: 600rpx;
      height: 600rpx;
      top: -200rpx;
      left: -200rpx;
    }
  
    &::after {
      width: 800rpx;
      height: 800rpx;
      bottom: -300rpx;
      right: -300rpx;
      animation-delay: -10s; // 错开动画时间
    }
  
    // 额外小动效点(模拟粒子)
    & > view {
      position: absolute;
      width: 400rpx;
      height: 400rpx;
      border-radius: 50%;
      background: rgba(59, 130, 246, 0.03);
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      animation: float 15s infinite linear reverse;
    }
  }
  
  // 浮动动画(模拟粒子运动)
  @keyframes float {
    0% {
      transform: translate(0, 0) rotate(0deg);
    }
    25% {
      transform: translate(50rpx, 30rpx) rotate(90deg);
    }
    50% {
      transform: translate(0, 60rpx) rotate(180deg);
    }
    75% {
      transform: translate(-50rpx, 30rpx) rotate(270deg);
    }
    100% {
      transform: translate(0, 0) rotate(360deg);
    }
c293da23   刘淇   新园林init
271
272
  }
  
37c26bd3   刘淇   巡查计划
273
  // 登录表单(悬浮层)
c293da23   刘淇   新园林init
274
  .login-form {
37c26bd3   刘淇   巡查计划
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
    position: relative;
    z-index: 10;
    background-color: rgba(255, 255, 255, 0.95);
    padding: 60rpx 40rpx;
    border-radius: 16rpx;
    box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08);
    max-width: 600rpx;
    margin: 0 auto;
    margin-top: 100rpx;
  
    // 登录标题
    .login-title {
      font-size: 36rpx;
      font-weight: 600;
      color: #111827;
      text-align: center;
      margin-bottom: 40rpx;
      letter-spacing: 2rpx;
    }
c293da23   刘淇   新园林init
294
295
  }
  
37c26bd3   刘淇   巡查计划
296
  // 表单项
c293da23   刘淇   新园林init
297
298
299
  .form-item {
    margin-bottom: 30rpx;
    position: relative;
c293da23   刘淇   新园林init
300
  
37c26bd3   刘淇   巡查计划
301
302
303
304
305
306
307
308
    // 错误提示
    .error-tip {
      font-size: 24rpx;
      color: #ef4444;
      margin-top: 10rpx;
      line-height: 1.2;
      padding-left: 10rpx;
    }
c293da23   刘淇   新园林init
309
310
  }
  
c293da23   刘淇   新园林init
311
  </style>