티스토리 뷰

반응형

이번에는 로그인 로그아웃 기능을 간단하게 구현했다. 로그인 로그아웃이 되니 이제 절반은 한것 같은 느낌이 난다. 어여 끝내고 진짜 사이트를 오픈을 빨리 해야겠다.



처음 사진은 로그인 하기 전~, 다음 사진은 로그인 하고 난 후~ 구현은 간단하게 2개의 스택패널을 만들어서 로그인 전, 로그인 후 2개를 번갈아가며 보여지도록 만들었다.

1. LoginInfo.cs
모든 뷰모델, 모델에서 임포트 시켜서 사용할 수 있도록 만들었다

using System;
using System.ComponentModel;
using System.ComponentModel.Composition;

//로그인 유저 정보
namespace SL5_BOARD.PublicData
{
    /// <summary>
    /// 로그인 정보
    /// </summary>
    [Export(typeof(LoginInfo))]
    public class LoginInfo : INotifyPropertyChanged
    {
        #region PropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
            }
        }
        #endregion

        int mstMemberIdx;
        /// <summary>
        /// 로그인 유저 idx
        /// </summary>
        public int MstMemberIdx
        {
            get
            {
                return mstMemberIdx;
            }
            set
            {
                if (mstMemberIdx != value)
                {
                    mstMemberIdx = value;
                    OnPropertyChanged("MstMemberIdx");
                }
            }
        }

        string eMail;
        /// <summary>
        /// 로그인 유저 Email
        /// </summary>
        public string EMail
        {
            get
            {
                return eMail;
            }
            set
            {
                if (eMail != value)
                {
                    eMail = value;
                    OnPropertyChanged("EMail");
                }
            }
        }

        string memberName;
        /// <summary>
        /// 로그인 유저 이름
        /// </summary>
        public string MemberName
        {
            get
            {
                return memberName;
            }
            set
            {
                if (memberName != value)
                {
                    memberName = value;
                    OnPropertyChanged("MemberName");
                }
            }
        }

        string nickName;
        /// <summary>
        /// 로그인 유저 닉네임
        /// </summary>
        public string NickName
        {
            get
            {
                return nickName;
            }
            set
            {
                if (nickName != value)
                {
                    nickName = value;
                    OnPropertyChanged("NickName");
                }
            }
        }

        DateTime lastLoginDt;
        /// <summary>
        /// 로그인 일시
        /// </summary>
        public DateTime LastLoginDt
        {
            get
            {
                return lastLoginDt;
            }
            set
            {
                if (lastLoginDt != value)
                {
                    lastLoginDt = value;
                    OnPropertyChanged("LastLoginDt");
                }
            }
        }

        string memberGrade;
        /// <summary>
        /// 로그인 유저 등급
        /// </summary>
        public string MemberGrade
        {
            get
            {
                return memberGrade;
            }
            set
            {
                if (memberGrade != value)
                {
                    memberGrade = value;
                    OnPropertyChanged("MemberGrade");
                }
            }
        }

        int listCount;
        /// <summary>
        /// 게시물 카운트
        /// </summary>
        public int ListCount
        {
            get
            {
                return listCount;
            }
            set
            {
                if (listCount != value)
                {
                    listCount = value;
                    OnPropertyChanged("ListCount");
                }
            }
        }

        int attachCount;
        /// <summary>
        /// 덧글 카운트
        /// </summary>
        public int AttachCount
        {
            get
            {
                return attachCount;
            }
            set
            {
                if (attachCount != value)
                {
                    attachCount = value;
                    OnPropertyChanged("AttachCount");
                }
            }
        }

        /// <summary>
        /// 생성자
        /// </summary>
        public LoginInfo()
        {
            InitLoginInfo();
        }

        /// <summary>
        /// 로그인 정보 초기화
        /// </summary>
        public void InitLoginInfo()
        {
            MstMemberIdx = 0;
            EMail = "";
            MemberName = "";
            LastLoginDt = DateTime.Parse("2000-01-01");
            MemberGrade = "";
            ListCount = 0;
            AttachCount = 0;
            IsLogin = false;
        }

        bool isLogin;
        /// <summary>
        /// 로그인 여부
        /// </summary>
        public bool IsLogin
        {
            get
            {
                return isLogin;
            }
            set
            {
                if (isLogin != value)
                {
                    isLogin = value;
                    OnPropertyChanged("IsLogin");
                }
            }
        }
    }
}

2. MainPageViewModel.cs

일단 방금 만든 클래스를 임포트 시켜야 한다.

        /// <summary>
        /// 로그인 정보 임포트
        /// </summary>
        [Import(typeof(LoginInfo))]
        public LoginInfo LoginIF { get; set; }


임포트를 시켰으니..이넘한테 로그인 처리된 데이터를 넣어 주어야 한다. 그럴려면 이전에 만들어 놓았던 Mst_Member 모델을 사용해야하니 그넘도 임포트를 시킨다.

        /// <summary>
        /// 로그인 처리를 하기위한 멤버마스터 모델 임포트
        /// </summary>
        MstMember mstMemberModel;
        [Import(typeof(MstMember))]
        public MstMember MstMemberModel
        {
            get
            {
                return mstMemberModel;
            }
            set
            {
                mstMemberModel = value;
                mstMemberModel.PropertyChanged += new PropertyChangedEventHandler(MstMemberModel_PropertyChanged);
            }
        }


MstMember 모델 임포트를 시키면서 프로퍼티 체인지 이벤트를 구현했다. 그래야 로그인 후에 데이터를 받아서 처리를 할 수 있기 때문이다.

        /// <summary>
        /// 멤버 마스터 모델의 프로퍼티 체인지 이벤트 구현
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void MstMemberModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            switch (e.PropertyName)
            {
                case "MessageData":
                    //모델에서 발생한 메시지를 뷰모델로 끌어 올려서 통합 적으로 관리
                    MessageData = MstMemberModel.MessageData;
                    break;
                case "LoginMember":
                    if (MstMemberModel.LoginMember != null)
                    {
                        //로그인 성공했을 경우
                        // admin@localhost
                        // p@ssw0rd
                        MST_MEMBER member = MstMemberModel.LoginMember;

                        LoginIF.MstMemberIdx = member.MST_MEMBER_IDX;
                        LoginIF.EMail = member.EMAIL;
                        LoginIF.MemberName = member.MEMBER_NAME;
                        LoginIF.NickName = member.NICK_NAME;
                        LoginIF.MemberGrade = member.MEMBER_GRADE;

                        LoginIF.ListCount = member.BoardLists.Count;
                        LoginIF.LastLoginDt = DateTime.Now;
                        member.LAST_LOGIN_DT = DateTime.Now;
                        LoginIF.IsLogin = true;

                        //마지막 로그인 일자 저장
                        mstMemberModel.Saving();
                    }
                    else
                    {
                        //로그아웃 null값을 가지는 경우는 강제로 넣는 것 말고는 없냉
                        MessageData = "로그아웃 되었습니다.";
                        LoginEmail = "";
                        LoginPassword = "";

                        LoginIF.MstMemberIdx = 0;
                        LoginIF.EMail = "";
                        LoginIF.MemberName = "";
                        LoginIF.NickName = "";
                        LoginIF.MemberGrade = "";
                        LoginIF.ListCount = 0;
                        LoginIF.LastLoginDt = DateTime.Parse("2000-01-01");
                        LoginIF.IsLogin = false;
                    }
                    break;
            }
        }

그리고, 로그인 버튼 클릭했을 때의 로그인 커맨드와 로그아웃 커맨드 2개를 새로 만들어야한다.

        ICommand loginCommand;
        public ICommand LoginCommand
        {
            get
            {
                if (loginCommand == null)
                {
                    loginCommand = new ActionCommand(() =>
                    {
                        //로그인 확인
                        MstMemberModel.Login(LoginEmail, LoginPassword);
                    });
                }
                return loginCommand;
            }
        }

        ICommand logoutCommand;
        public ICommand LogoutCommand
        {
            get
            {
                if (logoutCommand == null)
                {
                    logoutCommand = new ActionCommand(() =>
                    {
                        //로그아웃
                        MstMemberModel.LoginMember = null;
                    });
                }
                return logoutCommand;
            }
        }

로그인 작업에서 사용한 Login() 메소드는 약간 수정이 되었다. 기존에는 loadComplete로 이동을 해서 결과를 처리 했으나, 이번에는 그냥 LoginMember에 데이터를 쑤셔 넣는 역할로 변경되었다.
(메인 페이지에 연결되어있다보니, ConditionData, CurrentData등의 기존 사용중인 것들과 같이 쓸 수가 없어서 변경했다.)

        //로그인
        public void Login(string email, string password)
        {
            //로그인시 이메일과 비밀번호를 쿼리에 넣어서 보내야함.(쿼리도 바꿔주고)
            if (BoardDomainService.Context.IsLoading == false)
            {
                BoardDomainService.Context.Load(
                                                BoardDomainService.Context.GetMstMemberByLoginQuery(email, password),
                                                LoadBehavior.RefreshCurrent,
                                                load =>
                                                {
                                                    if (load.HasError == false)
                                                    {
                                                        MessageData = "로그인 성공";
                                                        LoginMember = load.AllEntities.Cast<MST_MEMBER>().FirstOrDefault();
                                                    }
                                                },
                                                true);
            }
            else
            {
                MessageData = "조회 중이니 잠시 후 다시 시도해 주시기 바랍니다.";
            }
        }

로그아웃 커맨드에서는 LoginMember에 Null 값만 넣으면 자동으로 로그 아웃 처리가 되도록 되어있다. 음..개선의 여지는 있지만..나름 간편한 방법을 사용했다.

3. 기타 수정사항 확인

** 로그인 상태에 따른 스택패널 보이기 숨기기 작업

MainPage.xaml 을 참조

<!--로그인창-->
<Border x:Name="Login" BorderBrush="#FF81C1C7" BorderThickness="4" CornerRadius="10" Visibility="{Binding LoginIF.IsLogin, Converter={StaticResource VisibilityReversConverter}}">

.......

<!--로그인 멤버 정보 보이는 박스 영역-->
<Border x:Name="MemberInfo" BorderBrush="#FF81C1C7" BorderThickness="4" CornerRadius="10" Visibility="{Binding LoginIF.IsLogin, Converter={StaticResource VisibilityConverter}}" d:IsHidden="True">

.......

LoginIF.IsLogin 값에 따라서 보이고 앙보이게 컨버터를 이용해서 처리함

4. 전체 소스를 올리도록 하겠다.
주석이 있으니 참고하면서..소스를 보면 도움이 될 것이라고 생각한다. 소스에서 이해가 앙되거나 추가 설명이 필요한 부분은 리플로 남겨주면 다시 설명을 달도록 하겠다.

반응형
댓글