v9.6.2017.0808   重构正向工程,基于映射表查找数据库字段类型到实体类型的映射
大石头 编写于 2017-08-08 21:38:06
X
using System;
using NewLife.Net;

namespace NewLife.Model
{
    /// <summary>用户接口,具有登录验证、注册、在线等基本信息</summary>
    public interface IManageUser
    {
        #region 属性
        /// <summary>编号</summary>
        Int32 ID { get; set; }

        /// <summary>名称</summary>
        String Name { get; set; }

        /// <summary>密码</summary>
        String Password { get; set; }

        /// <summary>昵称</summary>
        String NickName { get; set; }

        /// <summary>在线</summary>
        Boolean Online { get; set; }

        /// <summary>启用</summary>
        Boolean Enable { get; set; }

        /// <summary>登录次数</summary>
        Int32 Logins { get; set; }

        /// <summary>最后登录</summary>
        DateTime LastLogin { get; set; }

        /// <summary>最后登录IP</summary>
        String LastLoginIP { get; set; }

        /// <summary>注册时间</summary>
        DateTime RegisterTime { get; set; }

        /// <summary>注册IP</summary>
        String RegisterIP { get; set; }
        #endregion

        /// <summary>保存</summary>
        /// <returns></returns>
        Int32 Save();
    }

    /// <summary>用户接口工具类</summary>
    public static class ManageUserHelper
    {
        /// <summary>比较密码相等</summary>
        /// <param name="user"></param>
        /// <param name="pass"></param>
        /// <returns></returns>
        public static Boolean CheckEqual(this IManageUser user, String pass)
        {
            // 验证密码
            if (user.Password != pass) throw new Exception(user + " 密码错误");

            return true;
        }

        /// <summary>比较密码MD5</summary>
        /// <param name="user"></param>
        /// <param name="pass"></param>
        /// <returns></returns>
        public static Boolean CheckMD5(this IManageUser user, String pass)
        {
            // 验证密码
            if (user.Password != pass.MD5()) throw new Exception(user + " 密码错误");

            return true;
        }

        /// <summary>比较密码RC4</summary>
        /// <param name="user"></param>
        /// <param name="pass"></param>
        /// <returns></returns>
        public static Boolean CheckRC4(this IManageUser user, String pass)
        {
            // 密码有盐值和密文两部分组成
            var salt = pass.Substring(0, pass.Length / 2).ToHex();
            pass = pass.Substring(pass.Length / 2);

            // 验证密码
            var tpass = user.Password.GetBytes();
            if (salt.RC4(tpass).ToHex() != pass) throw new Exception(user + " 密码错误");

            return true;
        }

        /// <summary>保存登录信息</summary>
        /// <param name="user"></param>
        /// <param name="session"></param>
        public static void SaveLogin(this IManageUser user, INetSession session)
        {
            user.Logins++;
            user.LastLogin = DateTime.Now;

            if (session != null)
            {
                user.LastLoginIP = session.Remote?.EndPoint?.Address + "";
                // 销毁时
                session.OnDisposed += (s, e) =>
                {
                    user.Online = false;
                    user.Save();
                };
            }

            user.Online = true;
            user.Save();
        }

        /// <summary>保存注册信息</summary>
        /// <param name="user"></param>
        /// <param name="session"></param>
        public static void SaveRegister(this IManageUser user, INetSession session)
        {

        }
    }
}