通用权限管理系统记录登录日志中的一个问题

最近,在使用通用权限管理系统开发一个项目,数据库是MSSQL,登录时出现一个错误,发现是记录登录日志时出现的错误。

由于每次登录,都会记录登录日志,就是在记录日志时出现了错误。

先把错误截图

可以看出与记录登录日志的表BaseLoginLog的ID有关系,打开该表

发现该表的ID是nvarchar(50)类型,查询一下该表的数据,截图如下

可看到,ID实际存储的是GUID类型数据,然后我在调试底层代码,找到三个地方:

 1         /// <summary>
 2         /// 记录登录日志
 3         /// </summary>
 4         /// <param name="systemCode">系统编码</param>
 5         /// <param name="userId">用户ID</param>
 6         /// <param name="userName">登录用户名</param>
 7         /// <param name="ipAddress">IP地址</param>
 8         /// <param name="macAddress">MAC地址</param>
 9         /// <param name="loginStatus">登录结果</param>
10         /// <returns></returns>
11         public static string AddLog(string systemCode, string userId, string userName, string ipAddress, string macAddress, string loginStatus)
12         {
13             BaseLoginLogEntity entity = new BaseLoginLogEntity();
14             entity.SystemCode = systemCode;
15             entity.UserId = userId;
16             entity.UserName = userName;
17             entity.IPAddress = ipAddress;
18             entity.MACAddress = macAddress;
19             entity.LoginStatus = loginStatus;
20             entity.CreateOn = DateTime.Now;
21             string tableName = BaseLoginLogEntity.TableName;
22             if (BaseSystemInfo.BusinessDbType == CurrentDbType.Oracle)
23             {
24                 tableName += DateTime.Now.ToString("yyyyMM");
25             }
26             BaseLoginLogManager loginLogManager = new BaseLoginLogManager(tableName);
27             return loginLogManager.Add(entity, true, false);
28         }
 1         /// <summary>
 2         /// 添加, 这里可以人工干预,提高程序的性能
 3         /// </summary>
 4         /// <param name="entity">实体</param>
 5         /// <param name="identity">自增量方式,表主键是否采用自增的策略</param>
 6         /// <param name="returnId">返回主键,不返回程序允许速度会快,主要是为了主细表批量插入数据优化用的</param>
 7         /// <returns>主键</returns>
 8         public string Add(BaseLoginLogEntity entity, bool identity = false, bool returnId = false)
 9         {
10             this.Identity = identity;
11             this.ReturnId = returnId;
12             return this.AddObject(entity);
13         }
 1         /// <summary>
 2         /// 添加登录日志  多数据库支持
 3         /// </summary>
 4         /// <param name="entity">登录日志实体</param>
 5         public string AddObject(BaseLoginLogEntity entity)
 6         {
 7             string key = string.Empty;
 8             if (!string.IsNullOrWhiteSpace(entity.Id))
 9             {
10                 key = entity.Id.ToString();
11             }
12             SQLBuilder sqlBuilder = new SQLBuilder(DbHelper, this.Identity, this.ReturnId);
13             sqlBuilder.BeginInsert(this.CurrentTableName, this.PrimaryKey);
14             if (!this.Identity)
15             {
16                 // 这里已经是指定了主键了,所以不需要返回主键了
17                 sqlBuilder.ReturnId = false;
18                 sqlBuilder.SetValue(this.PrimaryKey, entity.Id);
19             }
20             else
21             {
22                 if (!this.ReturnId && (DbHelper.CurrentDbType == CurrentDbType.Oracle || DbHelper.CurrentDbType == CurrentDbType.DB2))
23                 {
24                     if (DbHelper.CurrentDbType == CurrentDbType.Oracle)
25                     {
26                         sqlBuilder.SetFormula(this.PrimaryKey, "SEQ_" + this.CurrentTableName.ToUpper() + ".NEXTVAL ");
27                     }
28                     if (DbHelper.CurrentDbType == CurrentDbType.DB2)
29                     {
30                         sqlBuilder.SetFormula(this.PrimaryKey, "NEXT VALUE FOR SEQ_" + this.CurrentTableName.ToUpper());
31                     }
32                 }
33                 else
34                 {
35                     if (this.Identity && (DbHelper.CurrentDbType == CurrentDbType.Oracle || DbHelper.CurrentDbType == CurrentDbType.DB2))
36                     {
37                         BaseSequenceManager sequenceManager = new BaseSequenceManager(DbHelper);
38                         entity.Id = sequenceManager.Increment(this.CurrentTableName);
39                         sqlBuilder.SetValue(this.PrimaryKey, entity.Id);
40                     }
41                 }
42             }
43             this.SetObject(sqlBuilder, entity);
44             sqlBuilder.SetDBNow(BaseLoginLogEntity.FieldCreateOn);
45             if (this.Identity && (DbHelper.CurrentDbType == CurrentDbType.SqlServer || DbHelper.CurrentDbType == CurrentDbType.Access))
46             {
47                 key = sqlBuilder.EndInsert().ToString();
48             }
49             else
50             {
51                 sqlBuilder.EndInsert();
52             }
53             if (this.Identity && (DbHelper.CurrentDbType == CurrentDbType.Oracle || DbHelper.CurrentDbType == CurrentDbType.DB2))
54             {
55                 return entity.Id.ToString();
56             }
57             return key;
58         }

从代码中可以看出,并没有对ID进行赋值的地方,本来想将底层代码改一下,将生成一个GUID后作为ID值加入进去,后来考虑到这么做不是很好,

考虑到可以直接改一下数据库中的字段类型,将原来的nvarchar(50)类型改为uniqueidentifier类型,并设置了默认值(newid())。

如下图:

再次运行项目,错误不在出现了。

大家在使用通用权限管理系统开发项目中,如果遇到一些问题,可加入“通用权限管理系统”QQ交流群:371168832,一起交流、共同提高。

时间: 2024-08-04 05:51:19

通用权限管理系统记录登录日志中的一个问题的相关文章

如何在通用权限管理系统中集成log4net日志功能

开发人员都知道,在系统运行中要记录各种日志,自己写一个日志功能,无论是在效率还是功能扩展上来说都不是很好,目前大多用的是第三方的日志系统,其中一个非常有名,用的最多的就是log4net.下面是关于这个组件的介绍 ”Log4net是基于.net开发的一款非常著名的记录日志开源组件.最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源, 于另外的一个非常著名的姐妹组件-log4j.现由Apache组织开发与维护.此日志架构是可灵活扩展,且通过配置文件来设置日志的属性及输出,

通用权限管理系统数据权限设置功能解析

在权限管理系统中,数据权限是比较难的,在我们通用权限系统中,数据权限指的是用户基于某个权限域对某些基础数据的操作权限,如上图,公司管理这个菜单被定义是数据权限,表示某些人在公司管理是可指定访问哪些基础数据,这个要与应用结合.如下图,可以限制该9999xudeng003用户在公司管理页面只能管理其中的几个公司. 目前基于用户的数据权限BS的管理功能已完成,这个是权限系统最难开发的一部分. 下面是MVC控制器调的通用权限管理系统底层的方法: //---------------------------

通用权限管理系统接口文档V4.2 版本之消息接口介绍

通用权限管理系统提供的消息接口可实现消息获取,消息发送,底层使用Redis对消息进行缓存,解决消息的并发请求对数据库的压力. 前端可以通过客户端轮询来获取最新消息,前端效果截图如下: 1.发送消息 2.收到消息 3.消息回复 前端效果参考代码,前端可根据自己的需要进行功能封装,实现即时消息的功能,主要是JS实现的消息轮询和发送功能, Html部分: <div style="display: none" id="ShowMessage"> <tabl

通用权限管理系统菜单展示的一个技巧

从这篇文章,希望您了解吉日嘎拉通用权限管理系统菜单项展示技巧. 项目中使用了吉日嘎拉的通用权限管理系统,几十个子系统均由该权限管理系统管理. 在系统中配置好相关菜单及非菜单项,配置截图: 菜单权限设置截图 通过下拉菜单进入其中的一个子系统 子系统中的菜单项(菜单项表示该项会在前端需要展示出来,用于用户点击的项目),其中的公开表示所有人均可看到该菜单项目. 子系统中的非菜单项(非菜单项表示该项目不需要在前端展示出来,比如有些在页面中的弹出窗口.按钮等项目) 通过单点登录到子系统以后,通过一个服务获

分享一套MVC4+EF5+EasyUI技术实现通用权限管理系统

课程讲师:闲筝 课程分类:.NET框架 适合人群:高级 课时数量:150课时 更新程度:完毕 服务类型:B类(VIP服务类课程) 用到技术:MVC.EF.T4.Log4net.EasyUI.rdlc.spring.net等 涉及项目:通用权限管理系统.十二生肖案例.EasyUI150项示例 课程咨询QQ:2050339477 链接:http://ibeifeng.taobao.com/index.htm?spm=2013.1.w5002-9616636101.2.aNEcLW 项目背景: 自从微

通用权限管理系统底层更换最新Oracle驱动的方法

通用权限管理系统底层先前访问Oracle数据库时需要客户端安装驱动软件,如下图: 安装完毕还需要一番配置,系统再引用其dll, 现在我们使用了最新的dll 该dll是Oracle出的最新的版本. 通用权限管理系统底层需要调整的地方: 1.OracleHelper.cs调整 OracleHelper.cs完整的代码 namespace DotNet.Utilities { // 需要安装客户端安装驱动 //using Oracle.DataAccess.Client; // 2016.07.04

基于MVC4+EF5+EasyUI技术实现通用权限管理系统(EpPlus、HignCharts、Reportviewer报表)视频教程

基于MVC4+EF5+EasyUI技术实现通用权限管理系统(EpPlus.HignCharts.Reportviewer报表)视频教程 联系QQ:1026270010 1.项目研发环境 项目源代码会提供以MVC4+EF5和MVC5+EF6为基准的两套版本,数据库会提供以Sqlserver2005为基准的数据库脚本,以下环境都适用于项目. 开发工具:VS2012,VS2013; 数据库工具:SqlServer2005,2008,2012,2014    其他工具:Easyui,Jquery,EpP

零基础到CS开发高手通用权限管理系统全程实录

零基础到CS开发高手通用权限管理系统全程实录(Devexpress.FastReport.NET.WebService.智能客户端)课程讲师:闲筝课程分类:.NET框架适合人群:中级课时数量:70课时更新程度:80%用到技术:Devexpress.FastReport.NET.WebService.智能客户端涉及项目:通权系统.智能客户端.报表设计器咨询qq:1840215592 详细介绍:http://www.ibeifeng.com/goods-493.html项目主要功能模块:闲筝老师的.

通用权限管理系统之权限菜单zTree树的展示及移动的处理方法

在通用权限管理系统中,有很多数据结构是有父子关系的,如组织机构,部门,权限菜单等,在展示的时候,大多数是通过zTree树的形式展现的,如下: 权限菜单展示 这种数据后台输出比较容易处理,参考如下获取某个子系统的全部操作菜单: 后台输出zTree树的数据 /// <summary> /// 获取module树结构数据 /// </summary> /// <param name="systemCode"></param> /// <r