Răsfoiți Sursa

feat: 合并dev分支代码

zhouyuhao 11 luni în urmă
părinte
comite
5a0e9cea35

BIN
src/components/VSliderVerification/src/image/verification-img-1.png


BIN
src/components/VSliderVerification/src/image/verification-img-2.png


+ 14 - 2
src/stores/modules/user.ts

@@ -2,16 +2,24 @@ import { defineStore } from 'pinia'
 
 interface UserState {
   username: string
+  isFirstLogin: boolean
 }
 export const useUserStore = defineStore('user', {
   state: (): UserState => ({
-    username: localStorage.getItem('username') || ''
+    username: localStorage.getItem('username') || '',
+    isFirstLogin: localStorage.getItem('isFirstLogin')
+      ? JSON.parse(localStorage.getItem('isFirstLogin'))
+      : false
   }),
   getters: {},
   actions: {
-    setUsername(username: any) {
+    setUsername(username: any, isFirstLogin?: boolean) {
       localStorage.setItem('username', username)
       this.username = username
+      if (isFirstLogin !== undefined) {
+        localStorage.setItem('isFirstLogin', JSON.stringify(isFirstLogin))
+        this.isFirstLogin = isFirstLogin
+      }
     },
     async logout(isNeedLogout: boolean = true) {
       if (isNeedLogout) {
@@ -19,6 +27,10 @@ export const useUserStore = defineStore('user', {
       }
       localStorage.removeItem('username')
       this.username = ''
+      if (localStorage.getItem('isFirstLogin')) {
+        localStorage.removeItem('isFirstLogin')
+      }
+      this.isFirstLogin = false
     }
   }
 })

+ 4 - 2
src/views/Booking/src/BookingView.vue

@@ -370,13 +370,15 @@ const getbookingdata = () => {
       }
     })
 }
-const changeTag = (val: any) => {
+const changeTag = (val: any, boolean: any) => {
   filterData.filtersTagData = []
   searchTableQeury.filterTag = val
   let str = 'Shipment status: ' + val
   filterData.filtersTagData.push(str)
   sessionStorage.setItem('searchTableQeury', JSON.stringify(searchTableQeury))
-  getbookingdata()
+  if (boolean) {
+    getbookingdata()
+  }
   renderTagsData()
   filterTag.value = val
 }

+ 1 - 1
src/views/Dashboard/src/DashboardView.vue

@@ -90,7 +90,7 @@ const GetDashboardData = () => {
         GetTop10ODEcharts(Top10DefaultData.value)
         GetCo2EmissionEcharts(Co2OriginDefaultData.value)
         GetCo2DestinationEcharts(Co2DestinationDefaultData.value)
-        GetRevenueEcharts(RevenueDefaultData.value)
+        // GetRevenueEcharts(RevenueDefaultData.value)
       })
     })
 }

+ 3 - 3
src/views/Layout/src/components/Header/HeaderView.vue

@@ -246,13 +246,13 @@ const handleLogin = () => {
           </div>
         </div>
         <template #reference>
-          <div class="header-avatar" v-if="userStore.username">
+          <div class="header-avatar" v-if="userStore.username && userStore.isFirstLogin !== true">
             <span style="">{{ userStore.username?.slice(0, 1) }}</span>
           </div>
         </template>
       </el-popover>
       <el-button
-        v-if="!userStore.username"
+        v-if="!userStore.username || (userStore.username && userStore.isFirstLogin === true)"
         class="el-button--main"
         style="padding: 8px 10px"
         plain
@@ -262,7 +262,7 @@ const handleLogin = () => {
         Download KLN Portal
       </el-button>
       <el-button
-        v-if="!userStore.username"
+        v-if="!userStore.username || (userStore.username && userStore.isFirstLogin === true)"
         class="el-button--main"
         style="margin-left: -10px"
         @click="handleLogin"

+ 2 - 0
src/views/Layout/src/components/Header/components/DownloadKLNPortal.vue

@@ -45,6 +45,8 @@ defineExpose({
       img {
         width: 140px;
         height: 140px;
+        margin-bottom: 5px;
+        border-radius: 12px;
       }
     }
   }

+ 15 - 2
src/views/Login/src/components/ChangePasswordCard.vue

@@ -1,7 +1,9 @@
 <script setup lang="ts">
-import { useRouter } from 'vue-router'
 import { useThemeStore } from '@/stores/modules/theme'
+import { useRouter, useRoute } from 'vue-router'
+import { useUserStore } from '@/stores/modules/user'
 
+const userStore = useUserStore()
 const router = useRouter()
 
 const themeStore = useThemeStore()
@@ -24,6 +26,13 @@ onMounted(() => {
   )
 })
 
+const route = useRoute()
+
+const tips = ref('Please change your password for security.')
+
+if (route.query.firstLogin === 't') {
+  tips.value = 'First login, please change your password.'
+}
 const loginForm = ref({
   username: '',
   oldPassword: '',
@@ -131,6 +140,10 @@ const checkPassword = () => {
   // 检测长度是否符合要求
   isValidLength.value = pwd.length >= 12 && pwd.length <= 20
 }
+
+onUnmounted(() => {
+  userStore.logout(false)
+})
 </script>
 
 <template>
@@ -138,7 +151,7 @@ const checkPassword = () => {
     <el-card class="login-card">
       <div class="title">
         <span class="welcome">Change Password</span>
-        <span class="tips">Password expired, please change your password.</span>
+        <span class="tips">{{ tips }}</span>
       </div>
 
       <div class="login-form">

+ 68 - 0
src/views/Login/src/components/FirstLoginTips.vue

@@ -0,0 +1,68 @@
+<script setup lang="ts">
+import { useRouter } from 'vue-router'
+const dialogVisible = ref(false)
+const router = useRouter()
+
+const openDialog = () => {
+  dialogVisible.value = true
+}
+const handleChangePassword = () => {
+  dialogVisible.value = false
+  router.push({
+    name: 'Reset Password',
+    query: {
+      firstLogin: 't'
+    }
+  })
+}
+defineExpose({
+  openDialog
+})
+</script>
+
+<template>
+  <el-dialog v-model="dialogVisible" top="25vh" :width="480" class="error-tips" :center="true">
+    <img style="margin-bottom: 18px" src="../image/first-login-tips-icon.png" alt="" />
+    <p class="blod-tips">Update your password</p>
+    <p>
+      To make your account secure, please create a new password to replace the temporary password
+      you were given in the email.
+    </p>
+    <template #footer>
+      <el-button
+        class="el-button--dark"
+        @click="handleChangePassword"
+        style="height: 40px; padding: 8px 30px"
+        >Change Password</el-button
+      >
+    </template>
+  </el-dialog>
+</template>
+
+<style lang="scss">
+.error-tips {
+  text-align: center;
+  .el-dialog__header {
+    display: none;
+  }
+  .el-dialog__body {
+    padding: 32px 32px 24px;
+    text-align: center;
+  }
+  .blod-tips {
+    font-size: 18px;
+    font-weight: 700;
+    margin-bottom: 8px;
+  }
+  p {
+    & > a {
+      text-decoration: underline;
+      color: var(--color-theme);
+      cursor: pointer;
+    }
+  }
+  &.el-dialog--center .el-dialog__footer {
+    padding-right: 0;
+  }
+}
+</style>

BIN
src/views/Login/src/image/first-login-tips-icon.png


+ 56 - 86
src/views/Login/src/loginView.vue

@@ -1,6 +1,7 @@
 <script setup lang="ts">
 import { useRouter, useRoute } from 'vue-router'
 import ErrorTips from './components/ErrorTips.vue'
+import FirstLoginTips from './components/FirstLoginTips.vue'
 import { useUserStore } from '@/stores/modules/user'
 import { useThemeStore } from '@/stores/modules/theme'
 import ScoringSystem from '@/views/Dashboard/src/components/ScoringSystem.vue'
@@ -51,51 +52,7 @@ const handleTokenRedirect = () => {
         token: obj.token
       })
       .then((res: any) => {
-        if (res.code === 200) {
-          const { data } = res
-          if (data.msg === 'today' || data.msg === 'last') {
-            const expiredDays = data.msg === 'today' ? 'today' : `in ${data.data} days`
-            ElMessageBox.confirm(
-              `Your password will expire ${expiredDays}, please reset your password`,
-              'Prompt',
-              {
-                confirmButtonText: 'OK',
-                cancelButtonText: 'Change Password',
-                type: 'warning',
-                confirmButtonClass: 'el-button--dark',
-                cancelButtonClass: 'el-button--main',
-                distinguishCancelAndClose: true
-              }
-            ).catch((action: any) => {
-              if (action === 'cancel') {
-                router.push({
-                  name: 'Reset Password'
-                })
-              }
-            })
-          }
-          userStore.setUsername(res.data.uname || '')
-          router.push('/')
-        } else if (res.code === 400) {
-          const { data } = res
-          if (data.msg === 'Invalid token') {
-            ElMessageBox.alert('Invalid token', 'Prompt', {
-              confirmButtonText: 'OK',
-              type: 'warning',
-              confirmButtonClass: 'el-button--dark'
-            })
-          } else if (data.msg === 'passwordExpires') {
-            ElMessageBox.alert('Password expired, please change your password', 'Prompt', {
-              confirmButtonText: 'OK',
-              type: 'warning',
-              confirmButtonClass: 'el-button--dark'
-            })
-            userStore.setUsername(res.data.uname || '')
-            router.push({
-              name: 'Reset Password'
-            })
-          }
-        }
+        handleResult(res)
       })
   }
 }
@@ -236,6 +193,57 @@ const confirmVerification = () => {
   }
 }
 
+const handleResult = (res: any) => {
+  if (res.code === 200) {
+    const { data } = res
+    if (data.msg === 'today' || data.msg === 'last') {
+      const expiredDays = data.msg === 'today' ? 'today' : `in ${data.data} days`
+      ElMessageBox.confirm(
+        `Your password will expire ${expiredDays}, please reset your password`,
+        'Prompt',
+        {
+          confirmButtonText: 'OK',
+          cancelButtonText: 'Change Password',
+          type: 'warning',
+          confirmButtonClass: 'el-button--dark',
+          cancelButtonClass: 'el-button--main',
+          distinguishCancelAndClose: true
+        }
+      ).catch((action: any) => {
+        if (action === 'cancel') {
+          router.push({
+            name: 'Reset Password'
+          })
+        }
+      })
+    }
+    userStore.setUsername(res.data.uname || '')
+    router.push('/')
+  } else if (res.code === 400) {
+    const { data } = res
+    if (data.msg === 'Invalid token') {
+      ElMessageBox.alert('Invalid token', 'Prompt', {
+        confirmButtonText: 'OK',
+        type: 'warning',
+        confirmButtonClass: 'el-button--dark'
+      })
+    } else if (data.msg === 'passwordExpires') {
+      ElMessageBox.alert('Please change your password for security.', 'Prompt', {
+        confirmButtonText: 'Change Password',
+        type: 'warning',
+        confirmButtonClass: 'el-button--dark'
+      })
+      userStore.setUsername(res.data.uname || '')
+      router.push({
+        name: 'Reset Password'
+      })
+    } else if (data.msg === 'First login, please change your password') {
+      userStore.setUsername(res.data.uname, true)
+      firstLoginTipsRef.value.openDialog()
+    }
+  }
+}
+
 // 验证结束后调用登录接口
 const handleLoginAfterVerify = () => {
   $api
@@ -246,53 +254,13 @@ const handleLoginAfterVerify = () => {
     })
     .then((res: any) => {
       if (res.code === 200) {
-        const { data } = res
         if (isRememerPwd.value) {
           saveCredentials()
         } else {
           clearCredentials()
         }
-        if (data.msg === 'today' || data.msg === 'last') {
-          const expiredDays = data.msg === 'today' ? 'today' : `in ${data.data} days`
-          ElMessageBox.confirm(
-            `Your password will expire ${expiredDays}, please reset your password`,
-            'Prompt',
-            {
-              confirmButtonText: 'OK',
-              cancelButtonText: 'Change Password',
-              type: 'warning',
-              confirmButtonClass: 'el-button--dark',
-              cancelButtonClass: 'el-button--main',
-              distinguishCancelAndClose: true
-            }
-          ).catch((action: any) => {
-            if (action === 'cancel') {
-              router.push({
-                name: 'Reset Password'
-              })
-            }
-          })
-        }
-        userStore.setUsername(res.data.uname || '')
-        router.push('/')
-      } else if (res.code === 400) {
-        const { data } = res
-        if (data.msg === 'password_error') {
-          loginError.value.password = true
-        } else if (data.msg === 'error_times') {
-          errorTipsRef.value.openDialog()
-        } else if (data.msg === 'passwordExpires') {
-          ElMessageBox.alert('Password expired, please change your password', 'Prompt', {
-            confirmButtonText: 'OK',
-            type: 'warning',
-            confirmButtonClass: 'el-button--dark'
-          })
-          userStore.setUsername(res.data.uname || '')
-          router.push({
-            name: 'Reset Password'
-          })
-        }
       }
+      handleResult(res)
     })
 }
 
@@ -358,6 +326,7 @@ const handleDeleteEmailTips = (type?: any) => {
 }
 
 const errorTipsRef = ref()
+const firstLoginTipsRef = ref()
 </script>
 
 <template>
@@ -493,6 +462,7 @@ const errorTipsRef = ref()
       ref="sliderVerificationRef"
     ></VSliderVerification>
     <ErrorTips ref="errorTipsRef" @forget-password="status = 'reset'"></ErrorTips>
+    <FirstLoginTips ref="firstLoginTipsRef" @forget-password="status = 'reset'"></FirstLoginTips>
   </div>
 </template>