ads367 / AJIN-ERP star
류윤주 류윤주 2024-03-12
240312 이세현 로그인 기능
@707ab52d5a4406d3206f6dc9298cdcec157e2743
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -2,6 +2,8 @@
 
 import Main from "../pages/main/Main.vue";
 import Login from "../pages/login/Login.vue";
+import store from './AppStore'
+import axios from 'axios';
 
 // 기준정보 BaselinInformation
 import Bi001 from "./AccountingManagement/BaselineInformation/Bi001.vue";
@@ -40,37 +42,39 @@
   routes,
 });
 
-// AppRouter.beforeEach(async (to, from, next)=>{
-//   const userId = store.state.loginUser;
+AppRouter.beforeEach(async (to, from, next)=>{
+  const userId = store.state.loginUser;
   
-//   if(userId == null && to.path != '/login.page'){
-//       var vm = this;                
-//       axios({
-//           url: '/getLoginInfo.json',
-//           method: 'post',             
-//           headers: {
-//               'Content-Type': 'application/json; charset=UTF-8'                    
-//           }       
-//       }).then(function (response) {     
-//           // 로그인 정보 있음
-//           if(response.data.checkMessage.status > 0){     
-//               store.commit('setLoginUser',response.data.resultData.LoginUserInfo);           
-//               next()    
-//           }else{
-//             next('/login.page')
-//           }
-//       }).catch(function (error) {
-//           console.log(error);
-//       });
-//   }else{
-//     if(to.path == '/login.page' && userId == null){    
-//        next()
-//     }else if(to.path != '/login.page' && userId == null){
-//        next('/login.page')
-//     }else{
-//        next()
-//     }
-//   } 
-// })
+  if(userId == null && to.path != '/login.page'){
+      var vm = this;                
+      axios({
+          url: '/getLoginInfo.json',
+          method: 'post',             
+          headers: {
+              'Content-Type': 'application/json; charset=UTF-8'                    
+          }       
+      }).then(function (response) {     
+          // 로그인 정보 있음
+          if(response.data.checkMessage.status > 0){     
+              store.commit('setLoginUser',response.data.resultData.LoginUserInfo);           
+              next()    
+          }else{
+            next('/login.page')
+          }
+      }).catch(function (error) {
+          console.log(error);
+      });
+  }else{
+    if(to.path == '/login.page' && userId != null ){
+      next('/Cm001.page')
+    }else if(to.path == '/login.page' && userId == null){    
+       next()
+    }else if(to.path != '/login.page' && userId == null){
+       next('/login.page')
+    }else{
+       next()
+    }
+  } 
+})
 
 export default AppRouter;
client/views/pages/layout/Header.vue
--- client/views/pages/layout/Header.vue
+++ client/views/pages/layout/Header.vue
@@ -1,10 +1,9 @@
 <template>
     <header>
-
         <div class="logo-wrap gd-12 flex justify-end  align-center ">
             <ul>
-                <li>박정현님</li>
-                <li class="header-border">로그아웃</li>
+                <li>{{ store.state.loginUser.usernm }} 님</li>
+                <li class="header-border" @click="logout">로그아웃</li>
             </ul>
         </div>
     </header>
@@ -12,13 +11,33 @@
 </template>
 
 <script>
+import axios from 'axios';
+import store from '../AppStore';
+
 export default {
     data() {
         return {
+            store : store
         }
     },
     methods: {
-
+        logout : function(){
+            const vm = this;                
+            axios({
+                url: '/logout.json',
+                method: 'post',             
+                headers: {
+                    'Content-Type': 'application/json; charset=UTF-8'                    
+                },            
+            }).then(function (response) {                
+                if(response.data.checkMessage.status > 0){                            
+                    store.commit('setLoginUser', null);    
+                    vm.$router.push({ path: '/login.page', query: {} });    
+                }
+            }).catch(function (error) {
+                console.log(error);
+            });
+        },
     },
     watch: {
 
@@ -27,6 +46,8 @@
 
     },
     mounted() {
+        console.log("header mounted")
+        console.log(store.state.loginUser)
     }
 }
 </script>
client/views/pages/login/Login.vue
--- client/views/pages/login/Login.vue
+++ client/views/pages/login/Login.vue
@@ -8,7 +8,7 @@
                     <input type="file" @change="handleFileUpload" id="fileUpload" accept="image/*"
                         style="display: none;">
                     <label for="fileUpload" style="display: block; width: 100%; height: 100%; cursor: pointer;">
-                        <img v-if="imagePreview" :src="imagePreview" alt="Image preview"
+                        <img v-if="imagePreview" :src="'data:image/jpeg;base64,' + imagePreview" alt="Image preview"
                             style="width: 100%; height: 100%;">
                         <div v-else style="width: 100%; height: 100%;" class="login-img"></div>
                     </label>
@@ -17,16 +17,16 @@
                 <div class="flex-column  gd-6">
                     <h1 class="mb1">LOGIN</h1>
                     <div class="user-name">
-                        <p>박정현</p>
+                        <p>{{ member.usernm }}</p>
                     </div>
                     <div class="login-box ">
                         <div class="login-user mb2">
                             <p>아이디</p>
-                            <input type="text " v-model="member.userid" ref="userid" @blur="getUserInfoById">
+                            <input type="text " v-model="member.userid" ref="userid" @keyup.enter="getUserInfoById()">
                         </div>
                         <div class="login-pw mb2">
                             <p>비밀번호</p>
-                            <input type="password" v-model="member.newwrd" ref="password">
+                            <input type="password" v-model="member.newwrd" ref="password" @focus="getUserInfoById()">
                         </div>
 
                         <div class="flex justify-between mb2 button-wrap">
@@ -35,7 +35,7 @@
                                 <label for="a">ID 저장하기</label>
 
                             </div>
-                            <button class="small-btn " @click="pwchange">비밀번호 변경하기</button>
+                            <button class="small-btn " @click="pwchange()">비밀번호 변경하기</button>
                         </div>
                         <button class="blue-btn large-btn "
                             style="padding: 10px !important; font-size: 1.5rem !important;" @click="login">로그인</button>
@@ -44,21 +44,21 @@
                     <div class="pwchange-modal pt10" v-show="isActive">
                         <div class="flex justify-between pwchange-header">
                             <h1 class="mt1 mb4">비밀번호 변경</h1>
-                            <button @click="pwChangeBtn"></button>
+                            <button @click="pwChangeBtn()"></button>
                         </div>
                         <div class="login-box  ">
                             <div class="pwchange-user mb2">
                                 <p>비밀번호 변경</p>
-                                <input type="text " v-model="pwChange.changedPwd">
+                                <input type="password" v-model="changePw.changedPwd">
                             </div>
                             <div class="pwchange-pw mb2">
                                 <p>비밀번호 확인</p>
-                                <input type="password" v-model="pwChange.CheckPwd">
+                                <input type="password" v-model="changePw.CheckPwd">
                             </div>
 
                             <button class="blue-btn large-btn "
                                 style="padding: 10px !important; font-size: 1.5rem !important;"
-                                @click="pwChangeBtn">비밀번호 변경하기</button>
+                                @click="updatePassword()">비밀번호 변경하기</button>
                         </div>
                     </div>
                 </div>
@@ -71,8 +71,9 @@
 <script>
 
 import axios from 'axios';
-import { useStore } from 'vuex';
 import Cookies from 'js-cookie';
+import { useStore } from 'vuex';
+import store from '../AppStore';
 
 
 export default {
@@ -87,9 +88,10 @@
                 usernm: null,
                 oldwrd: null,
                 newwrd: null,
+                requestURL: null,
             },
             //비밀번호 변경
-            pwChange: {
+            changePw: {
                 changedPwd: null,
                 CheckPwd: null,
             },
@@ -101,7 +103,6 @@
             //회원정보 유효성
             checkedUser : false,
         }
-
     },
     methods: {
         // login() {
@@ -117,18 +118,33 @@
                 reader.readAsDataURL(file);
             }
         },
-        pwchange() {
-            this.isActive = true;
+        //패스워드 변경 화면이동
+        async pwchange() {
+            //비밀번호 미입력
+            if(!this.member.newwrd){
+                alert("비밀번호를 입력하세요.")
+                return;
+            }
+        
+            this.member.requestURL = "PASSWORDCHANGE"
+            //사용자 유효 검사
+            await this.getUserInfo();
+            if(this.checkedUser){
+                this.isActive = true;
+            } else {
+                alert('회원정보가 일치하지 않습니다.')
+                this.isActive = false;
+            }
         },
-        pwChangeBtn() {
-            this.isActive = false;
-        },
+        // pwChangeBtn() {
+        //     this.isActive = false;
+        // },
 
         //사용자 아이디로 이름, 이미지 조회
         getUserInfoById: function () {
             const vm = this;
             axios({
-                url: '/getMemberById',
+                url: '/getMemberById.json',
                 method: 'post',
                 headers: {
                     'Content-Type': 'application/json;'
@@ -137,8 +153,8 @@
             }).then(function (response) {
                 console.log(response.data)
                 //1.회원 이름
-                vm.member.usernm = response.data.getNameById;
-                vm.imagePreview = response.data.getImageById;
+                vm.member.usernm = response.data.resultData.getNameById.resultData.member.usernm;
+                vm.imagePreview = response.data.resultData.getImageById.resultData.member.base64Image;
                 //2.회원 이미지
             }).catch(function (error) {
                 console.log(error);
@@ -158,6 +174,11 @@
         //로그인
         login: function () {
             const vm = this;
+
+            if(!vm.member.newwrd){
+                alert("비밀번호를 입력하세요.")
+                return;
+            }
             vm.passwordExpiryCheck();
             if (vm.passwordHaveToChange) {
                 alert("Password변경이 2달이상 지났습니다.. Password를 변경해주세요.")
@@ -174,10 +195,9 @@
                 data: vm.member
             }).then(function (response) {
                 if (response.data.checkMessage.status > 0) {
-                    console.log(response.data.resultData);
-                    store.commit('setLoginUser', response.data.resultData);
+                    store.commit('setLoginUser', response.data.resultData.LoginUserInfo);
                     vm.cookieInit();
-                    vm.$router.push({ path: '/', query: {} });
+                    vm.$router.push({ path: '/Cm001.page', query: {} });
                     console.log(store.state.loginUser);
                 }
             }).catch(function (error) {
@@ -190,33 +210,42 @@
         passwordExpiryCheck: function () {
             const vm = this;
             axios({
-                url: '/checkPasswordExpiry',
+                url: '/checkPasswordExpiry.json',
                 method: 'post',
                 headers: {
                     'Content-Type': 'application/json;'
                 },
                 data: vm.member
             }).then(function (response) {
-                vm.passwordHaveToChange = response.data.resultData;
+                if(response.data.checkMessage.status !== 200) {
+                    alert(response.data.checkMessage.message);
+                    return;
+                } 
+                vm.passwordHaveToChange = response.data.resultData.haveToChangePassword;
             }).catch(function (error) {
                 console.log(error);
             });
         },
 
         //아이디 비밀번호로 회원 조회(T/F)
-        getUserInfo : function() {
+        getUserInfo: function() {
             const vm = this;
-            axios({
-                url: '/getUserInfo',
-                method: 'post',
-                headers: {
-                    'Content-Type': 'application/json;'
-                },
-                data: vm.member
-            }).then(function (response) {
-                vm.checkedUser = response.data.resultData;
-            }).catch(function (error) {
-                console.log(error);
+
+            return new Promise((resolve, reject) => {
+                axios({
+                    url: '/getUserInfo.json',
+                    method: 'post',
+                    headers: {
+                        'Content-Type': 'application/json;'
+                    },
+                    data: vm.member
+                }).then(function(response) {
+                    vm.checkedUser = response.data.resultData.result;
+                    resolve(response); 
+                }).catch(function(error) {
+                    console.log(error);
+                    reject(error); 
+                });
             });
         },
 
@@ -224,30 +253,30 @@
         updatePassword: function() {
             const vm = this;
             //비밀번호 유효성 검사
-            if(!vm.passwordValidCheck){
-                return;
-            }
-            //유효한 회원인지 확인 + 로그 
-            vm.getUserInfo();
-            if(!vm.checkedUser){
-                alert("비밀번호 틀려요")
-                vm.$refs.password.focus();
+            if(!vm.passwordValidCheck()){
                 return;
             }
 
             axios({
-                url: '/updatePassword',
+                url: '/updatePassword.json',
                 method: 'post',
                 headers: {
                     'Content-Type': 'application/json;'
                 },
                 data: {
                     userid : vm.member.userid,
-                    newpwd : vm.pwChange.changedPwd,
+                    newwrd : vm.member.newwrd,
+                    changeWrd : vm.changePw.CheckPwd
                 }
             }).then(function (response) {
-                if(response.data.resultData){
-
+                if(response.data.resultData.result){
+                    alert("비밀번호 변경에 성공하였습니다.")
+                    vm.isActive = false;
+                    vm.changePw.CheckPwd = null;
+                    vm.changePw.changedPwd = null;
+                    vm.member.newwrd = null;
+                } else {
+                    alert("비밀번호 변경에 실패하였습니다.")
                 }
             }).catch(function (error) {
                 console.log(error);
@@ -257,12 +286,16 @@
 
         //비밀번호 유효성 검사
         passwordValidCheck: function() {
-            if(!this.pwChange.CheckPwd){
+            if(!this.changePw.CheckPwd){
                 alert("비밀번호를 입력하세요.")
                 return false;
             } 
-            if(this.pwChange.CheckPwd !== this.pwChange.changedPwd){
+            if(this.changePw.CheckPwd !== this.changePw.changedPwd){
                 alert("비밀번호가 일치하지 않습니다.")
+                return false;
+            }
+            if(this.changePw.CheckPwd.length > 20){
+                alert("비밀번호는 20자리를 넘을 수 없습니다.")
                 return false;
             }
 
@@ -284,6 +317,10 @@
         }
     },
     mounted() {
+        if(this.member.userid){
+            console.log("쿠키확인!!!")
+            this.getUserInfoById(); 
+        }
     }
 }
 </script>
Add a comment
List