Blame view

pages/login/index.vue 7.31 KB
c293da23   刘淇   新园林init
1
2
  <template>
    <view class="login-page">
8ddc6f6e   刘淇   登录 修改样式
3
4
5
6
7
      <!-- 顶部标题区 - 加高 + 左下大圆角 + 底部蓝色过滤阴影 + 从浅到深 蓝色渐变背景 -->
      <view class="top-title">
        <text class="welcome-text">你好,欢迎光临</text>
        <text class="platform-name">全域智能运营管理平台</text>
      </view>
37c26bd3   刘淇   巡查计划
8
  
8ddc6f6e   刘淇   登录 修改样式
9
      <!-- 登录表单区域 - 往上偏移 盖住top-title一部分 -->
c293da23   刘淇   新园林init
10
      <view class="login-form">
8ddc6f6e   刘淇   登录 修改样式
11
12
        <!-- 登录标题 -->
        <view class="login-title">账户登录</view>
37c26bd3   刘淇   巡查计划
13
  
8ddc6f6e   刘淇   登录 修改样式
14
15
16
17
18
19
20
21
22
23
        <!-- ✅ 核心:和工单页同款 up-form 表单校验容器 -->
        <up-form
            label-position="left"
            :model="form"
            ref="loginFormRef"
            labelWidth="0"
        >
          <!-- 账号输入框 + 校验 -->
          <up-form-item
              prop="account"
c293da23   刘淇   新园林init
24
          >
8ddc6f6e   刘淇   登录 修改样式
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
            <up-input
                v-model="form.account"
                border="surround"
                clearable
                maxlength="30"
                input-align="left"
                fontSize="16px"
                :disabled="isLoading"
                shape="circle"
                placeholder="请输入账户"
                selectionStart="15"
                selectionEnd="15"
                @blur="() => loginFormRef.validateField('account')"
            />
          </up-form-item>
c293da23   刘淇   新园林init
40
  
8ddc6f6e   刘淇   登录 修改样式
41
42
43
          <!-- 密码输入框 + 校验 -->
          <up-form-item
              prop="password"
c293da23   刘淇   新园林init
44
          >
8ddc6f6e   刘淇   登录 修改样式
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
            <up-input
                v-model="form.password"
                placeholder="请输入密码"
                maxlength="20"
                border="surround"
                clearable
                input-align="left"
                type="password"
                :disabled="isLoading"
                shape="circle"
                selectionStart="5"
                selectionEnd="5"
                @blur="() => loginFormRef.validateField('password')"
            />
          </up-form-item>
        </up-form>
c293da23   刘淇   新园林init
61
62
63
64
65
66
67
68
  
        <!-- 登录按钮 -->
        <up-button
            class="login-btn"
            type="primary"
            size="large"
            :loading="isLoading"
            @click="handleLogin"
8ddc6f6e   刘淇   登录 修改样式
69
            shape="circle"
c293da23   刘淇   新园林init
70
71
72
73
        >
          登录
        </up-button>
      </view>
8ddc6f6e   刘淇   登录 修改样式
74
75
76
  
      <!-- 版权信息 -->
      <view class="copyright">蓟城山水集团版权所有</view>
c293da23   刘淇   新园林init
77
78
79
80
    </view>
  </template>
  
  <script setup>
8ddc6f6e   刘淇   登录 修改样式
81
  import { ref, reactive, onMounted, nextTick } from 'vue';
c293da23   刘淇   新园林init
82
83
84
  import { useUserStore } from '@/pinia/user';
  import globalConfig from '@/common/config/global';
  
8ddc6f6e   刘淇   登录 修改样式
85
86
87
88
89
90
  // ========== 【全局实例 & 基础状态】 和工单页写法一致 ==========
  const userStore = useUserStore();
  const loginFormRef = ref(null); // 表单ref 用于校验
  const isLoading = ref(false);   // 登录加载状态
  
  // ========== 【表单数据】 和工单页一致的 reactive 声明 ==========
c293da23   刘淇   新园林init
91
  const form = reactive({
8ddc6f6e   刘淇   登录 修改样式
92
93
    account: '',  // 账号
    password: ''  // 密码
c293da23   刘淇   新园林init
94
95
  });
  
8ddc6f6e   刘淇   登录 修改样式
96
97
98
99
100
101
102
103
104
105
106
107
  // ========== 【表单校验规则】 ✅核心 和工单页1:1同款校验规则写法 ==========
  const loginFormRules = reactive({
    // 账号校验:必填 + 长度限制 2-30位(合理账号长度,可自行调整)
    account: [
      { type: 'string', required: true, message: '请输入登录账号', trigger: ['change', 'blur'] },
      { type: 'string', min: 2, max: 30, message: '账号长度为2-30个字符', trigger: ['change', 'blur'] }
    ],
    // 密码校验:必填 + 长度限制 6-20位(行业通用密码长度,可自行调整)
    password: [
      { type: 'string', required: true, message: '请输入登录密码', trigger: ['change', 'blur'] },
      { type: 'string', min: 6, max: 20, message: '密码长度为6-20个字符', trigger: ['change', 'blur'] }
    ]
c293da23   刘淇   新园林init
108
109
  });
  
8ddc6f6e   刘淇   登录 修改样式
110
  // ========== 【生命周期】 nextTick 设置校验规则 和工单页一致 ==========
c293da23   刘淇   新园林init
111
  onMounted(() => {
37c26bd3   刘淇   巡查计划
112
113
    // 检查登录态
    checkLoginStatus();
8ddc6f6e   刘淇   登录 修改样式
114
115
116
117
    // nextTick确保表单挂载完成再赋值规则,修复校验不生效bug,和工单页写法一致
    nextTick(() => {
      loginFormRef.value?.setRules(loginFormRules);
    });
37c26bd3   刘淇   巡查计划
118
119
  });
  
8ddc6f6e   刘淇   登录 修改样式
120
  // ========== 【检查登录状态】 原有逻辑不变 ==========
37c26bd3   刘淇   巡查计划
121
  const checkLoginStatus = () => {
c293da23   刘淇   新园林init
122
123
124
125
    try {
      // 已登录则直接跳首页
      if (userStore.isLogin) {
        uni.switchTab({
e6a04285   刘淇   单图情况 宽高70*70
126
          url: '/pages/workbench/index',
c293da23   刘淇   新园林init
127
          fail: () => {
e6a04285   刘淇   单图情况 宽高70*70
128
            uni.reLaunch({ url: '/pages/workbench/index' });
c293da23   刘淇   新园林init
129
130
131
132
133
134
135
          }
        });
        return;
      }
    } catch (err) {
      console.warn('检查登录状态失败:', err);
    }
37c26bd3   刘淇   巡查计划
136
  };
c293da23   刘淇   新园林init
137
  
8ddc6f6e   刘淇   登录 修改样式
138
  // ========== 【核心登录方法】 ✅ 完整表单校验 + 登录逻辑,和工单页submit提交逻辑一致 ==========
c293da23   刘淇   新园林init
139
  const handleLogin = async () => {
c293da23   刘淇   新园林init
140
    try {
8ddc6f6e   刘淇   登录 修改样式
141
142
143
144
145
      // ✅ 第一步:先执行表单整体校验,通过后再执行登录逻辑(和工单页submitWorkOrder写法一致)
      await loginFormRef.value.validate();
  
      isLoading.value = true;
      // 执行登录请求
c293da23   刘淇   新园林init
146
147
148
149
150
      await userStore.login({
        username: form.account,
        password: form.password
      });
  
e6a04285   刘淇   单图情况 宽高70*70
151
      uni.showToast({ title: '登录成功', icon: 'success', duration: 1000 });
c293da23   刘淇   新园林init
152
  
37c26bd3   刘淇   巡查计划
153
      // 登录成功后跳转首页
c293da23   刘淇   新园林init
154
      setTimeout(() => {
c293da23   刘淇   新园林init
155
156
157
158
        uni.switchTab({
          url: globalConfig.router.tabBarList[1].path,
          fail: (err) => {
            console.warn('tabBar跳转失败,切换为普通跳转:', err);
e6a04285   刘淇   单图情况 宽高70*70
159
            uni.reLaunch({ url: '/pages/workbench/index' });
c293da23   刘淇   新园林init
160
161
          }
        });
e6a04285   刘淇   单图情况 宽高70*70
162
      }, 1000);
c293da23   刘淇   新园林init
163
    } catch (err) {
8ddc6f6e   刘淇   登录 修改样式
164
165
166
167
168
169
170
171
172
      // ✅ 校验失败/登录失败 统一捕获提示,和工单页异常处理一致
      if (!Array.isArray(err)) {
        console.error('登录失败:', err);
        uni.showToast({
          title: err.message || '账号或密码错误,请重试',
          icon: 'none',
          duration: 2000
        });
      }
c293da23   刘淇   新园林init
173
174
175
176
177
178
179
    } finally {
      isLoading.value = false;
    }
  };
  </script>
  
  <style scoped lang="scss">
37c26bd3   刘淇   巡查计划
180
  // 核心布局
c293da23   刘淇   新园林init
181
182
  .login-page {
    min-height: 100vh;
8ddc6f6e   刘淇   登录 修改样式
183
    padding: 0;
c293da23   刘淇   新园林init
184
    box-sizing: border-box;
8ddc6f6e   刘淇   登录 修改样式
185
186
187
    overflow: hidden;
    position: relative;
    background: #f5f7fa;
37c26bd3   刘淇   巡查计划
188
189
  }
  
8ddc6f6e   刘淇   登录 修改样式
190
191
192
193
194
195
196
197
198
199
  // 顶部:从左到右 由浅到深 线性渐变 过渡自然柔和 无突兀色块
  .top-title {
    background: linear-gradient(120deg, #4299e1 0%, #2970e8 50%, #2563eb 100%);
    color: #fff;
    padding: 240rpx 30rpx 80rpx;
    text-align: left;
    border-bottom-left-radius: 120rpx;
    position: relative;
    z-index: 1;
    box-shadow: 0 25rpx 40rpx -15rpx rgba(37, 99, 235, 0.3);
37c26bd3   刘淇   巡查计划
200
  
8ddc6f6e   刘淇   登录 修改样式
201
202
203
204
205
    .welcome-text {
      font-size: 46rpx;
      display: block;
      margin-bottom: 10px;
      font-weight: 500;
37c26bd3   刘淇   巡查计划
206
207
    }
  
8ddc6f6e   刘淇   登录 修改样式
208
209
210
211
212
    .platform-name {
      margin-bottom: 10px;
      font-size: 46rpx;
      display: block;
      opacity: 0.95;
37c26bd3   刘淇   巡查计划
213
214
215
    }
  }
  
c293da23   刘淇   新园林init
216
  .login-form {
8ddc6f6e   刘淇   登录 修改样式
217
218
219
220
221
    background-color: #fff;
    padding: 40rpx 30rpx;
    border-radius: 16rpx;
    box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.06);
    margin: -60rpx 40rpx 0;
37c26bd3   刘淇   巡查计划
222
223
    position: relative;
    z-index: 10;
8ddc6f6e   刘淇   登录 修改样式
224
    box-sizing: border-box;
37c26bd3   刘淇   巡查计划
225
  
37c26bd3   刘淇   巡查计划
226
    .login-title {
8ddc6f6e   刘淇   登录 修改样式
227
      font-size: 38rpx;
37c26bd3   刘淇   巡查计划
228
      font-weight: 600;
8ddc6f6e   刘淇   登录 修改样式
229
230
231
      color: #666;
      margin-bottom: 30rpx;
      letter-spacing: 1rpx;
37c26bd3   刘淇   巡查计划
232
    }
c293da23   刘淇   新园林init
233
234
  }
  
8ddc6f6e   刘淇   登录 修改样式
235
236
237
  // 适配表单校验的间距
  :deep(.u-form-item) {
    margin-bottom: 20rpx;
c293da23   刘淇   新园林init
238
    position: relative;
8ddc6f6e   刘淇   登录 修改样式
239
  }
c293da23   刘淇   新园林init
240
  
8ddc6f6e   刘淇   登录 修改样式
241
242
243
244
245
246
247
248
249
250
251
  // 登录按钮:和顶部完全同款 从左到右 由浅到深 线性渐变 + 保留所有原尺寸
  .login-btn {
    margin-top: 40rpx;
    width: 100%;
    height: 88rpx;
    line-height: 88rpx;
    border-radius: 8rpx;
    font-size: 32rpx;
    background: linear-gradient(120deg, #4299e1 0%, #2970e8 50%, #2563eb 100%) !important;
    border: none !important;
    &::after { border: none !important; }
c293da23   刘淇   新园林init
252
253
  }
  
8ddc6f6e   刘淇   登录 修改样式
254
255
256
257
258
259
260
261
  .copyright {
    width: 100%;
    text-align: center;
    font-size: 24rpx;
    color: #999;
    position: fixed;
    bottom: 100px;
  }
c293da23   刘淇   新园林init
262
  </style>