服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2024-08-29 3cab868262d5e84cd1000851c07cce43a459f3ea
增加CS客户端登录逻辑
已修改9个文件
已添加1个文件
572 ■■■■ 文件已修改
Tiger.Api/Controllers/Base/LoginController.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/SYS/Biz.SYS_BS_LOGIN.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/SYS/Biz.SYS_CS_LOGIN.cs 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness/Common/ILogin.cs 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/SYS/LOG_BS_LOGIN.cs 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/SYS/LOG_CS_LOGIN.cs 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/SYS/LOG_PDA_LOGIN.cs 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/SYS/SYS_BS_LOGIN.cs 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/SYS/SYS_CS_LOGIN.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/SYS/SYS_PDA_LOGIN.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Controllers/Base/LoginController.cs
@@ -17,6 +17,7 @@
    [ApiController]
    public class LoginController : ControllerBase
    {
        #region BS
        /// <summary>
        /// ç™»å½•
        /// </summary>
@@ -25,7 +26,7 @@
        [HttpPost]
        public async Task<IActionResult> LoginAsync([FromBody] ApiAction<UserInfo> action)
        {
            return Ok(await DI.Resolve<ILogin>().Login(action));
            return Ok(await DI.Resolve<ILogin>().BSLogin(action));
        }
        /// <summary>
        /// åˆ‡æ¢æ®ç‚¹
@@ -35,7 +36,7 @@
        [HttpGet]
        public async Task<IActionResult> SwitchOrgCode(string token, string org, string fty)
        {
            return Ok(await DI.Resolve<ILogin>().SwitchOrgCode(token,org, fty));
            return Ok(await DI.Resolve<ILogin>().BSSwitchOrgCode(token,org, fty));
        }
        /// <summary>
        /// èŽ·å–ç™»å½•ä¿¡æ¯
@@ -46,7 +47,7 @@
        public async Task<IActionResult> GetLoginInfo(string token)
        {
            var _token =string.IsNullOrEmpty(token)?Request.Headers["Authorization"].ToString(): token;
            return Ok(await DI.Resolve<ILogin>().GetLoginInfo(_token));
            return Ok(await DI.Resolve<ILogin>().GetBSLoginInfo(_token));
        }
        /// <summary>
@@ -57,7 +58,44 @@
        [HttpPost]
        public async Task<IActionResult> LogoutAsync([FromBody] ApiAction action)
        {
            return Ok(await DI.Resolve<ILogin>().Logout(action.Data?.ToString()));
            return Ok(await DI.Resolve<ILogin>().BSLogout(action.Data?.ToString()));
        }
        #endregion
        #region CS
        /// <summary>
        /// ç™»å½•
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> CSLoginAsync([FromBody] ApiAction<UserInfo> action)
        {
            return Ok(await DI.Resolve<ILogin>().CSLogin(action));
        }
        /// <summary>
        /// èŽ·å–ç™»å½•ä¿¡æ¯
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<IActionResult> GetCSLoginInfo(string token)
        {
            var _token = string.IsNullOrEmpty(token) ? Request.Headers["Authorization"].ToString() : token;
            return Ok(await DI.Resolve<ILogin>().GetCSLoginInfo(_token));
        }
        /// <summary>
        /// æ³¨é”€
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> CSLogoutAsync([FromBody] ApiAction action)
        {
            return Ok(await DI.Resolve<ILogin>().CSLogout(action.Data?.ToString()));
        }
        #endregion
    }
}
Tiger.Business/SYS/Biz.SYS_BS_LOGIN.cs
@@ -19,7 +19,7 @@
        /// <param name="token"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public async Task<SYS_BS_LOGIN> GetLoginInfo(string token, bool Async = true)
        public async Task<SYS_BS_LOGIN> GetBSLoginInfo(string token, bool Async = true)
        {
            SYS_BS_LOGIN query = null;
            try
@@ -70,7 +70,7 @@
        /// <param name="action"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public async Task<ApiAction<SYS_BS_LOGIN>> Login(ApiAction<UserInfo> action, bool Async = true)
        public async Task<ApiAction<SYS_BS_LOGIN>> BSLogin(ApiAction<UserInfo> action, bool Async = true)
        {
            var res = new ApiAction<SYS_BS_LOGIN>();
            try
@@ -169,13 +169,14 @@
            }
            return await Task.FromResult(res);
        }
        /// <summary>
        /// åˆ‡æ¢æ®ç‚¹
        /// </summary>
        /// <param name="action"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public async Task<ApiAction> SwitchOrgCode(string token,string org, string fty)
        public async Task<ApiAction> BSSwitchOrgCode(string token,string org, string fty)
        {
            var action = new ApiAction();
            try
@@ -209,7 +210,7 @@
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task<ApiAction> Logout(string token)
        public async Task<ApiAction> BSLogout(string token)
        {
            var res = new ApiAction();
            try
Tiger.Business/SYS/Biz.SYS_CS_LOGIN.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
using Tiger.Model;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using Rhea.Common;
using Tiger.IBusiness;
using Dm.filter.log;
namespace Tiger.Business
{
    public partial class Biz : ILogin
    {
        /// <summary>
        /// èŽ·å–CS登录信息
        /// </summary>
        /// <param name="token"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public async Task<SYS_CS_LOGIN> GetCSLoginInfo(string token, bool Async = true)
        {
            SYS_CS_LOGIN query = null;
            try
            {
                query = Db.Queryable<SYS_CS_LOGIN>().Where(x => x.TOKEN == token).First();
                if (query != null)
                {
                    //超过8小时删除登录
                    if ((DateTime.Now - query.LAST_ACCESS).Hours > 4)
                    {
                        Db.Deleteable(query).ExecuteCommand();
                        return null;
                    }
                }
            }
            catch (System.Exception ex)
            {
            }
            return await Task.FromResult(query);
        }
        /// <summary>
        /// CS登录
        /// </summary>
        /// <param name="action"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public async Task<ApiAction<SYS_CS_LOGIN>> CSLogin(ApiAction<UserInfo> action, bool Async = true)
        {
            var res = new ApiAction<SYS_CS_LOGIN>();
            try
            {
                UserInfo userInfo = action.Data;
                var user = Db.Queryable<SYS_USER>().Where(x => x.USER_ID == userInfo.USER_CODE && x.USER_PWD == userInfo.PASSWORD).First();
                if (user != null)
                {
                    if (user.STATUS_CODE == "ENABLE")
                    {
                        MES_FACTORY _factory = Db.Queryable<MES_FACTORY>()
                                                .WhereIF(!userInfo.FTY_CODE.IsNullOrEmpty(),x => x.FTY_CODE == userInfo.FTY_CODE)
                                                .First();
                        SYS_CS_LOGIN logininfo = new SYS_CS_LOGIN
                        {
                            USER_ID = user.USER_ID,
                            USER_NAME = user.USER_NAME,
                            LAST_ACCESS = DateTime.Now,
                            CREATE_TIME = DateTime.Now,
                            STATUS_CODE = user.STATUS_CODE,
                            CLIENT_IP = userInfo?.ip,
                            TOKEN = userInfo.Token ?? Guid.NewGuid().ToString("N"),
                            ID = Guid.NewGuid().ToString("N"),
                            ACCOUNT_TYPE = 0,
                            ORG_CODE = userInfo.ORG_CODE,
                            PROD_CODE = _factory?.FTY_CODE,
                        };
                        var org_code=Db.Queryable<V_USER_ORG>().Where(q=>q.USER_ID == userInfo.USER_CODE && q.ORG_CODE==userInfo.ORG_CODE).First();
                        if (org_code != null)
                        {
                            logininfo.ORG_CODE = org_code.ORG_CODE;
                        }
                        else
                        {
                            var prod_code = Db.Queryable<V_USER_PROD>().Where(q => q.USER_ID == userInfo.USER_CODE && q.PROD_CODE == userInfo.PROD_CODE).First();
                            if (prod_code != null)
                            {
                                logininfo.PROD_CODE = prod_code.PROD_CODE;
                            }
                            else
                            {
                                res.IsSuccessed = false;
                                res.Data = null;
                                res.LocaleMsg = L("SYS.Login.isNotOrgCode");//用户没有该据点的权限 }
                            }
                        }
                        LOG_CS_LOGIN loginlog = new()
                        {
                            USER_ID = user.USER_ID,
                            LOGIN_FROM = $"{userInfo?.ad_info?.nation}->{userInfo?.ad_info?.province}->{userInfo?.ad_info?.city};IP:{userInfo?.ip}",
                            LOGIN_TIME = DateTime.Now,
                            ORG_CODE = userInfo.ORG_CODE,
                            PROD_CODE = _factory?.FTY_CODE,
                        };
                        //保存登录日志
                        var db = Business.Biz.Db;
                        var dbTran = db.UseTran(() =>
                        {
                            db.Insertable(loginlog).ExecuteCommand();
                            if (logininfo != null)
                            {
                                var deres = db.Storageable(logininfo).ExecuteCommand();
                            }
                            res.Data = logininfo;
                        });
                        if (!dbTran.IsSuccess)
                        {
                            res.IsSuccessed = false;
                            res.Data = null;
                            res.LocaleMsg = L("SYS.Login.dbTranError");
                        }
                        res.Data = logininfo;
                    }
                    else
                    {
                        res.IsSuccessed = false;
                        res.Data = null;
                        res.LocaleMsg = L("SYS.Login.dbTranError");//用户已禁用
                    }
                }
                else
                {
                    res.IsSuccessed = false;
                    res.Data = null;
                    res.LocaleMsg = L("SYS.Login.errMsg401");//用户没有权限(令牌、用户名、密码错误)!
                }
            }
            catch (Exception ex)
            {
                res.CatchExceptionWithLog(ex, "登录异常");
            }
            return await Task.FromResult(res);
        }
        /// <summary>
        /// CS登出
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task<ApiAction> CSLogout(string token)
        {
            var res = new ApiAction();
            try
            {
                var query = Db.Queryable<SYS_CS_LOGIN>().Where(x => x.TOKEN == token).First();
                if (query != null)
                {
                    Db.Deleteable(query).ExecuteCommand();
                    return res;
                }
            }
            catch (Exception ex)
            {
                res.CatchExceptionWithLog(ex, "注销登录异常");
            }
            return await Task.FromResult(res);
        }
    }
}
Tiger.IBusiness/Common/ILogin.cs
@@ -11,13 +11,14 @@
{
    public interface ILogin
    {
        #region BS
        /// <summary>
        /// èŽ·å–ç™»å½•ä¿¡æ¯
        /// </summary>
        /// <param name="token"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public Task<SYS_BS_LOGIN> GetLoginInfo(string token, bool Async = true);
        public Task<SYS_BS_LOGIN> GetBSLoginInfo(string token, bool Async = true);
        /// <summary>
        /// æ·»åŠ è®°å½•
@@ -33,21 +34,46 @@
        /// <param name="action"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public Task<ApiAction<SYS_BS_LOGIN>> Login(ApiAction<UserInfo> action, bool Async = true);
        public Task<ApiAction<SYS_BS_LOGIN>> BSLogin(ApiAction<UserInfo> action, bool Async = true);
        /// <summary>
        /// åˆ‡æ¢æ®ç‚¹
        /// </summary>
        /// <param name="action"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public Task<ApiAction> SwitchOrgCode(string token, string org, string fty);
        public Task<ApiAction> BSSwitchOrgCode(string token, string org, string fty);
        /// <summary>
        /// æ³¨é”€
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public Task<ApiAction> Logout(string token);
        public Task<ApiAction> BSLogout(string token);
        #endregion
        #region CS
        /// <summary>
        /// èŽ·å–ç™»å½•ä¿¡æ¯
        /// </summary>
        /// <param name="token"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public Task<SYS_CS_LOGIN> GetCSLoginInfo(string token, bool Async = true);
        /// <summary>
        /// ç™»å½•
        /// </summary>
        /// <param name="action"></param>
        /// <param name="Async"></param>
        /// <returns></returns>
        public Task<ApiAction<SYS_CS_LOGIN>> CSLogin(ApiAction<UserInfo> action, bool Async = true);
        /// <summary>
        /// æ³¨é”€
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public Task<ApiAction> CSLogout(string token);
        #endregion
    }
}
Tiger.Model.Net/Entitys/SYS/LOG_BS_LOGIN.cs
@@ -6,96 +6,121 @@
namespace Tiger.Model
{
    /// <summary>
    /// å®žä½“:BS登录日志
    /// </summary>
    [Description("Primary:ID")]
    [Serializable]
    [SugarTable("LOG_BS_LOGIN")]
    public class LOG_BS_LOGIN : DbEntityOnlyID
    {
        #region æž„造函数
        /// <summary>
        /// å®žä½“:BS登录日志
        /// </summary>
        public LOG_BS_LOGIN() { }
        #endregion
    /// <summary>
    /// å®žä½“:BS登录日志
    /// </summary>
    [Description("Primary:ID")]
    [DisplayName("BS登录日志")]
    [Serializable]
    [SugarTable("LOG_BS_LOGIN")]
    public class LOG_BS_LOGIN : DbEntityOnlyID
    {
        #region æž„造函数
        /// <summary>
        /// å®žä½“:BS登录日志
        /// </summary>
        public LOG_BS_LOGIN() {}
        #endregion
        #region å…¬å…±å±žæ€§
        /// <summary>
        /// SessionID
        /// </summary>
        public string SESSION_ID { get; set; }
        /// <summary>
        /// å·¥åŽ‚
        /// </summary>
        public string FACTORY { get; set; }
        /// <summary>
        /// ç”¨æˆ·ID
        /// </summary>
        public string USER_ID { get; set; }
        /// <summary>
        /// ç™»å½•信息
        /// </summary>
        public string LOGIN_FROM { get; set; }
        /// <summary>
        /// ç™»å½•Channel
        /// </summary>
        public string LOGIN_CHANNEL { get; set; }
        /// <summary>
        /// ç™»å½•URL
        /// </summary>
        public string LOGIN_URL { get; set; }
        /// <summary>
        /// ç™»å½•æ—¶é—´
        /// </summary>
        public DateTime LOGIN_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç™»å‡ºURL
        /// </summary>
        public string LOGOUT_URL { get; set; }
        /// <summary>
        /// ç™»å‡ºæ—¶é—´
        /// </summary>
        public DateTime LOGOUT_TIME { get; set; } = DateTime.MinValue;
        #endregion
        #region å…¬å…±å±žæ€§
        /// <summary>
        /// SessionID
        /// </summary>
        [DisplayName("SessionID")]
        public string SESSION_ID { get; set; }
        /// <summary>
        /// å·¥åŽ‚
        /// </summary>
        [DisplayName("工厂")]
        public string FACTORY { get; set; }
        /// <summary>
        /// ç”¨æˆ·ID
        /// </summary>
        [DisplayName("用户ID")]
        public string USER_ID { get; set; }
        /// <summary>
        /// ç™»å½•信息
        /// </summary>
        [DisplayName("登录信息")]
        public string LOGIN_FROM { get; set; }
        /// <summary>
        /// ç™»å½•Channel
        /// </summary>
        [DisplayName("登录Channel")]
        public string LOGIN_CHANNEL { get; set; }
        /// <summary>
        /// ç™»å½•URL
        /// </summary>
        [DisplayName("登录URL")]
        public string LOGIN_URL { get; set; }
        /// <summary>
        /// ç™»å½•æ—¶é—´
        /// </summary>
        [DisplayName("登录时间")]
        public DateTime LOGIN_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç™»å‡ºURL
        /// </summary>
        [DisplayName("登出URL")]
        public string LOGOUT_URL { get; set; }
        /// <summary>
        /// ç™»å‡ºæ—¶é—´
        /// </summary>
        [DisplayName("登出时间")]
        public DateTime LOGOUT_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç»„织编码
        /// </summary>
        [DisplayName("组织编码")]
        public string ORG_CODE { get; set; }
        /// <summary>
        /// ç”Ÿäº§å•元编码
        /// </summary>
        [DisplayName("生产单元编码")]
        public string PROD_CODE { get; set; }
        /// <summary>
        /// ä»“库单元编码
        /// </summary>
        [DisplayName("仓库单元编码")]
        public string WH_CODE { get; set; }
        #endregion
        #region è™šæ‹Ÿå±žæ€§
        /*例子
        #region è™šæ‹Ÿå±žæ€§
        /*例子
        [SugarColumn(IsIgnore = true)]
        public string FieldName { get; set; }
        */
        #endregion
        #endregion
        #region å¤–键属性
        /*例子
        //一对一外键导航
        [Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是LOG_BS_LOGIN类里面的外键ID字段
        public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
        //一对多外键导航
        [Navigate(NavigateType.OneToMany, nameof(ClassA.LOG_BS_LOGINId))]//ClassA表中的LOG_BS_LOGINId
        public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
        //多对多外键导航
        [Navigate(typeof(MappingClass), nameof(MappingClass.LOG_BS_LOGINId), nameof(MappingClass.ClassAId))]//注意顺序
        public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
        #region å¤–键属性
        /*例子
        //一对一外键导航
        [Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是LOG_BS_LOGIN类里面的外键ID字段
        public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
        //一对多外键导航
        [Navigate(NavigateType.OneToMany, nameof(ClassA.LOG_BS_LOGINId))]//ClassA表中的LOG_BS_LOGINId
        public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
        //多对多外键导航
        [Navigate(typeof(MappingClass), nameof(MappingClass.LOG_BS_LOGINId), nameof(MappingClass.ClassAId))]//注意顺序
        public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
        */
        #endregion
        #endregion
        #region æžšä¸¾å˜é‡
        /*例子
        #region æžšä¸¾å˜é‡
        /*例子
        public enum FieldNames
        {
            [Description("枚举描述0")]
            [Description("枚举描述0")]
            Enum0,
            [Description("枚举描述1")]
            [Description("枚举描述1")]
            Enum1,
        }
        */
        #endregion
        #endregion
        #region å…¬å…±æ–¹æ³•
        #region å…¬å…±æ–¹æ³•
        #endregion
        #endregion
    }//endClass
    }//endClass
}
Tiger.Model.Net/Entitys/SYS/LOG_CS_LOGIN.cs
@@ -10,6 +10,7 @@
    /// å®žä½“:CS登录日志
    /// </summary>
    [Description("Primary:ID")]
    [DisplayName("CS登录日志")]
    [Serializable]
    [SugarTable("LOG_CS_LOGIN")]
    public class LOG_CS_LOGIN : DbEntityOnlyID
@@ -25,39 +26,58 @@
        /// <summary>
        /// SessionID
        /// </summary>
        [DisplayName("SessionID")]
        public string SESSION_ID { get; set; }
        /// <summary>
        /// å·¥åŽ‚
        /// </summary>
        public string FACTORY { get; set; }
        /// <summary>
        /// ç”¨æˆ·ID
        /// </summary>
        [DisplayName("用户ID")]
        public string USER_ID { get; set; }
        /// <summary>
        /// ç™»å½•信息
        /// </summary>
        [DisplayName("登录信息")]
        public string LOGIN_FROM { get; set; }
        /// <summary>
        /// ç™»å½•Channel
        /// </summary>
        [DisplayName("登录Channel")]
        public string LOGIN_CHANNEL { get; set; }
        /// <summary>
        /// ç™»å½•URL
        /// </summary>
        [DisplayName("登录URL")]
        public string LOGIN_URL { get; set; }
        /// <summary>
        /// ç™»å½•æ—¶é—´
        /// </summary>
        [DisplayName("登录时间")]
        public DateTime LOGIN_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç™»å‡ºURL
        /// </summary>
        [DisplayName("登出URL")]
        public string LOGOUT_URL { get; set; }
        /// <summary>
        /// ç™»å‡ºæ—¶é—´
        /// </summary>
        [DisplayName("登出时间")]
        public DateTime LOGOUT_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç»„织编码
        /// </summary>
        [DisplayName("组织编码")]
        public string ORG_CODE { get; set; }
        /// <summary>
        /// ç”Ÿäº§å•元编码
        /// </summary>
        [DisplayName("生产单元编码")]
        public string PROD_CODE { get; set; }
        /// <summary>
        /// ä»“库单元编码
        /// </summary>
        [DisplayName("仓库单元编码")]
        public string WH_CODE { get; set; }
        #endregion
        #region è™šæ‹Ÿå±žæ€§
Tiger.Model.Net/Entitys/SYS/LOG_PDA_LOGIN.cs
@@ -10,6 +10,7 @@
    /// å®žä½“:PDA登录日志
    /// </summary>
    [Description("Primary:ID")]
    [DisplayName("PDA登录日志")]
    [Serializable]
    [SugarTable("LOG_PDA_LOGIN")]
    public class LOG_PDA_LOGIN : DbEntityOnlyID
@@ -25,39 +26,58 @@
        /// <summary>
        /// SessionID
        /// </summary>
        [DisplayName("SessionID")]
        public string SESSION_ID { get; set; }
        /// <summary>
        /// å·¥åŽ‚
        /// </summary>
        public string FACTORY { get; set; }
        /// <summary>
        /// ç”¨æˆ·ID
        /// </summary>
        [DisplayName("用户ID")]
        public string USER_ID { get; set; }
        /// <summary>
        /// ç™»å½•信息
        /// </summary>
        [DisplayName("登录信息")]
        public string LOGIN_FROM { get; set; }
        /// <summary>
        /// ç™»å½•Channel
        /// </summary>
        [DisplayName("登录Channel")]
        public string LOGIN_CHANNEL { get; set; }
        /// <summary>
        /// ç™»å½•URL
        /// </summary>
        [DisplayName("登录URL")]
        public string LOGIN_URL { get; set; }
        /// <summary>
        /// ç™»å½•æ—¶é—´
        /// </summary>
        [DisplayName("登录时间")]
        public DateTime LOGIN_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç™»å‡ºURL
        /// </summary>
        [DisplayName("登出URL")]
        public string LOGOUT_URL { get; set; }
        /// <summary>
        /// ç™»å‡ºæ—¶é—´
        /// </summary>
        [DisplayName("登出时间")]
        public DateTime LOGOUT_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç»„织编码
        /// </summary>
        [DisplayName("组织编码")]
        public string ORG_CODE { get; set; }
        /// <summary>
        /// ç”Ÿäº§å•元编码
        /// </summary>
        [DisplayName("生产单元编码")]
        public string PROD_CODE { get; set; }
        /// <summary>
        /// ä»“库单元编码
        /// </summary>
        [DisplayName("仓库单元编码")]
        public string WH_CODE { get; set; }
        #endregion
        #region è™šæ‹Ÿå±žæ€§
Tiger.Model.Net/Entitys/SYS/SYS_BS_LOGIN.cs
@@ -10,6 +10,7 @@
    /// å®žä½“:BS登录信息
    /// </summary>
    [Description("Primary:ID")]
    [DisplayName("BS登录信息")]
    [Serializable]
    [SugarTable("SYS_BS_LOGIN")]
    public class SYS_BS_LOGIN : DbEntity
@@ -25,58 +26,83 @@
        /// <summary>
        /// ç™»å½•TOKEN
        /// </summary>
        [DisplayName("登录TOKEN")]
        public string TOKEN { get; set; }
        /// <summary>
        /// æœ€åŽç™»å½•æ—¶é—´
        /// </summary>
        [DisplayName("最后登录时间")]
        public DateTime LAST_ACCESS { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç”¨æˆ·ID
        /// </summary>
        [DisplayName("用户ID")]
        public string USER_ID { get; set; }
        /// <summary>
        /// ç”¨æˆ·å
        /// </summary>
        [DisplayName("用户名")]
        public string USER_NAME { get; set; }
        /// <summary>
        /// æƒé™
        /// </summary>
        [DisplayName("权限")]
        public string PERMISSION { get; set; }
        /// <summary>
        /// IP地址
        /// </summary>
        [DisplayName("IP地址")]
        public string CLIENT_IP { get; set; }
        /// <summary>
        /// è´¦å·ç±»åž‹
        /// </summary>
        [DisplayName("账号类型")]
        public int ACCOUNT_TYPE { get; set; }
        /// <summary>
        /// å·¥åŽ‚ä»£ç 
        /// å·¥åŽ‚ç¼–ç 
        /// </summary>
        [DisplayName("工厂编码")]
        public string FTY_CODE { get; set; }
        /// <summary>
        /// å·¥åŽ‚æè¿°
        /// </summary>
        [DisplayName("工厂描述")]
        public string FTY_NAME { get; set; }
        /// <summary>
        /// ç”¨æˆ·çŠ¶æ€
        /// </summary>
        [DisplayName("用户状态")]
        public string STATUS_CODE { get; set; }
        /// <summary>
        /// ç»„织编码
        /// </summary>
        public string ORG_CODE { get; set; }
        #endregion
        /// <summary>
        /// ç»„织编码
        /// </summary>
        [DisplayName("组织编码")]
        public string ORG_CODE { get; set; }
        #endregion
        #region è™šæ‹Ÿå±žæ€§
        /*例子
        #region è™šæ‹Ÿå±žæ€§
        /*例子
        [SugarColumn(IsIgnore = true)]
        public string FieldName { get; set; }
        */
        #endregion
        #endregion
        #region æžšä¸¾å˜é‡
        /*例子
        #region å¤–键属性
        /*例子
        //一对一外键导航
        [Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是SYS_BS_LOGIN类里面的外键ID字段
        public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
        //一对多外键导航
        [Navigate(NavigateType.OneToMany, nameof(ClassA.SYS_BS_LOGINId))]//ClassA表中的SYS_BS_LOGINId
        public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
        //多对多外键导航
        [Navigate(typeof(MappingClass), nameof(MappingClass.SYS_BS_LOGINId), nameof(MappingClass.ClassAId))]//注意顺序
        public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
        */
        #endregion
        #region æžšä¸¾å˜é‡
        /*例子
        public enum FieldNames
        {
            [Description("枚举描述0")]
@@ -85,11 +111,11 @@
            Enum1,
        }
        */
        #endregion
        #endregion
        #region å…¬å…±æ–¹æ³•
        #region å…¬å…±æ–¹æ³•
        #endregion
        #endregion
    }//endClass
    }//endClass
}
Tiger.Model.Net/Entitys/SYS/SYS_CS_LOGIN.cs
@@ -10,6 +10,7 @@
    /// å®žä½“:CS登录信息
    /// </summary>
    [Description("Primary:ID")]
    [DisplayName("CS登录信息")]
    [Serializable]
    [SugarTable("SYS_CS_LOGIN")]
    public class SYS_CS_LOGIN : DbEntityWithAuth
@@ -25,46 +26,57 @@
        /// <summary>
        /// ç™»å½•TOKEN
        /// </summary>
        [DisplayName("登录TOKEN")]
        public string TOKEN { get; set; }
        /// <summary>
        /// æœ€åŽç™»å½•æ—¶é—´
        /// </summary>
        [DisplayName("最后登录时间")]
        public DateTime LAST_ACCESS { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç”¨æˆ·ID
        /// </summary>
        [DisplayName("用户ID")]
        public string USER_ID { get; set; }
        /// <summary>
        /// ç”¨æˆ·å
        /// </summary>
        [DisplayName("用户名")]
        public string USER_NAME { get; set; }
        /// <summary>
        /// æƒé™
        /// </summary>
        [DisplayName("权限")]
        public string PERMISSION { get; set; }
        /// <summary>
        /// IP地址
        /// </summary>
        [DisplayName("IP地址")]
        public string CLIENT_IP { get; set; }
        /// <summary>
        /// è´¦å·ç±»åž‹
        /// </summary>
        [DisplayName("账号类型")]
        public int ACCOUNT_TYPE { get; set; }
        /// <summary>
        /// ç”¨æˆ·çŠ¶æ€
        /// </summary>
        [DisplayName("用户状态")]
        public string STATUS_CODE { get; set; }
        /// <summary>
        /// ç»„织编码
        /// </summary>
        [DisplayName("组织编码")]
        public string ORG_CODE { get; set; }
        /// <summary>
        /// ç”Ÿäº§å•元编码
        /// </summary>
        [DisplayName("生产单元编码")]
        public string PROD_CODE { get; set; }
        /// <summary>
        /// ä»“库单元编码
        /// </summary>
        [DisplayName("仓库单元编码")]
        public string WH_CODE { get; set; }
        #endregion
Tiger.Model.Net/Entitys/SYS/SYS_PDA_LOGIN.cs
@@ -10,6 +10,7 @@
    /// å®žä½“:PDA登录信息
    /// </summary>
    [Description("Primary:ID")]
    [DisplayName("PDA登录信息")]
    [Serializable]
    [SugarTable("SYS_PDA_LOGIN")]
    public class SYS_PDA_LOGIN : DbEntityWithAuth
@@ -25,46 +26,57 @@
        /// <summary>
        /// ç™»å½•TOKEN
        /// </summary>
        [DisplayName("登录TOKEN")]
        public string TOKEN { get; set; }
        /// <summary>
        /// æœ€åŽç™»å½•æ—¶é—´
        /// </summary>
        [DisplayName("最后登录时间")]
        public DateTime LAST_ACCESS { get; set; } = DateTime.MinValue;
        /// <summary>
        /// ç”¨æˆ·ID
        /// </summary>
        [DisplayName("用户ID")]
        public string USER_ID { get; set; }
        /// <summary>
        /// ç”¨æˆ·å
        /// </summary>
        [DisplayName("用户名")]
        public string USER_NAME { get; set; }
        /// <summary>
        /// æƒé™
        /// </summary>
        [DisplayName("权限")]
        public string PERMISSION { get; set; }
        /// <summary>
        /// IP地址
        /// </summary>
        [DisplayName("IP地址")]
        public string CLIENT_IP { get; set; }
        /// <summary>
        /// è´¦å·ç±»åž‹
        /// </summary>
        [DisplayName("账号类型")]
        public int ACCOUNT_TYPE { get; set; }
        /// <summary>
        /// ç”¨æˆ·çŠ¶æ€
        /// </summary>
        [DisplayName("用户状态")]
        public string STATUS_CODE { get; set; }
        /// <summary>
        /// ç»„织编码
        /// </summary>
        [DisplayName("组织编码")]
        public string ORG_CODE { get; set; }
        /// <summary>
        /// ç”Ÿäº§å•元编码
        /// </summary>
        [DisplayName("生产单元编码")]
        public string PROD_CODE { get; set; }
        /// <summary>
        /// ä»“库单元编码
        /// </summary>
        [DisplayName("仓库单元编码")]
        public string WH_CODE { get; set; }
        #endregion