博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CYQ.Data 轻量数据层之路 应用示例三 Aop切入留言系统--操作日志(二十七)
阅读量:5919 次
发布时间:2019-06-19

本文共 3291 字,大约阅读时间需要 10 分钟。

hot3.png

前言:

在8月份时,那时曾用CYQ.Data 1.2版本演示过一个完整的示例,留言版:详见:
本篇将使用2.N系列版本,在不改动原来留言版系统一行代码的情况下,实现其数据库操作日志功能。
最新版本下载见:

 

 

正文步骤:

 

一:建表

1:增加一个日志操作表[ActionLogs],这个少不了,表结构如下

2:创建表的数据库脚本如下:

05233500_x8YP.gif 创建ActionLogs表
CREATE
 
TABLE
 
[
dbo
]
.
[
ActionLogs
]
(
    
[
ID
]
 
[
int
]
 
IDENTITY
(
1
,
1
NOT
 
NULL
,
    
[
UserID
]
 
[
int
]
 
NULL
,
    
[
Msg
]
 
[
nvarchar
]
(
500
) COLLATE Chinese_PRC_CI_AS 
NULL
,
    
[
LogTime
]
 
[
datetime
]
 
NULL
 
CONSTRAINT
 
[
DF_ActionLogs_LogTime
]
  
DEFAULT
 (
getdate
()),
 
CONSTRAINT
 
[
PK_ActionLogs
]
 
PRIMARY
 
KEY
 
CLUSTERED
 
(
    
[
ID
]
 
ASC
)
WITH
 (IGNORE_DUP_KEY 
=
 
OFF
ON
 
[
PRIMARY
]
ON
 
[
PRIMARY
]

 

 

二:建类库项目独立实现操作日志

1:新建一个项目类库起名就叫:AopLog,同时添加对CYQ.Data.DLL的引用[2.N系列版本]

2:新建一个类,继承自CYQ.Data.Aop.IAop接口,并实现之如:

05233500_x8YP.gif
    
public
 class AopLog : IAop
    {
        #region IAop 成员
         
public
 void 
Begin
(AopEnum action, string objName, params object
[]
 aopInfo)
        {
            
//
这里先没用到,用于权限判断
        }
        
public
 void 
End
(AopEnum action, bool success, object id, params object
[]
 aopInfo)
        {
            
//
这里等会要实现
        }
        
public
 IAop GetFromConfig()
        {
            
return
 
null
;
//
默认这样就行了
        }
        
public
 void OnError(string msg)
        {
            
//
这里先没用到,数据库操作异常时引发
        }
        #endregion
    }

 

3:我们将具体实现分流到另一个类处理:新建类:ActionLog.cs,并预先留下方法接口:

05233500_x8YP.gif
public
 
class
 ActionLog
{
    
public
 
void
 WriteFill(
object
 id)
    {
    }
    
public
 
void
 WriteInsert(
object
 id)
    {    
    }
    
#region
 其它方法
     
private
 
int
 GetUserID()
    {
    }
    
private
 
void
 Write(
object
 id, 
string
 msg)
    {   
    }
    
private
 
bool
 ContainUrl(
string
 key)
    {     
    }
    
#endregion
}

 

4:回到AopLog实现方法

05233500_x8YP.gif AopLog 实现 只是添加了一个构造函数和实现End方法
    
public
 
class
 AopLog : IAop
    {
        ActionLog log;
        
public
 AopLog()
        {
            log 
=
 
new
 ActionLog();
        }
        
#region
 IAop 成员
        
public
 
void
 Begin(AopEnum action, 
string
 objName, 
params
 
object
[] aopInfo)
        {
        }
        
public
 
void
 End(AopEnum action, 
bool
 success, 
object
 id, 
params
 
object
[] aopInfo)
        {
            
if
 (success)
            {
                
switch
 (action)
                {
                    
case
 AopEnum.Fill:
                        log.WriteFill(id);
                        
break
;
                    
case
 AopEnum.Insert:
                        log.WriteInsert(id);
                        
break
;
                    
default
:
                        
break
;
                }
            }
        }
        
public
 IAop GetFromConfig()
        {
            
return
 
null
;
//
这个默认返回null就行了
        }
        
public
 
void
 OnError(
string
 msg)
        {
            
//
在数据库操作异常时引发
        }
        
#endregion
    }

5:实现ActionLog方法

a:从Session获取用户ID

05233500_x8YP.gif
       
private
 
int
 GetUserID()
        {
            
int
 id
=
0
;
            
if
 (HttpContext.Current.Session[
"
ID
"
!=
 
null
)
            {
                
int
.TryParse(Convert.ToString(HttpContext.Current.Session[
"
ID
"
]), 
out
 id);
            }
            
return
 id;
        }

b:插入表数据方法封装

05233500_x8YP.gif
        
private
 
void
 Write(
object
 id,
string
 msg)
        {
            
int
 userID 
=
 GetUserID();
            
if
 (userID 
==
 
0
)
            {
                
int
.TryParse(Convert.ToString(id), 
out
 userID);
            }
            
if
 (userID 
>
 
0
)
            {
                MAction action 
=
 
new
 MAction(TableNames.ActionLogs);
                action.SetNoAop();
//
写日志时,注意关掉Aop功能。
                action.Set(ActionLogs.UserID, userID);
                action.Set(ActionLogs.Msg, msg);
                action.Insert();
                action.Close();
            }
        }

c:检测Url是否包含指定字符

        
private
 
bool
 ContainUrl(
string
 key)
        {
            
return
 System.Web.HttpContext.Current.Request.Url.ToString().ToLower().Contains(key);
        }

d:实现登陆日志记录

        
public
 
void
 WriteFill(
object
 id)
        {
            
if
 (ContainUrl(
"
login.aspx
"
))
            {
                Write(id,
"
登陆成功!
"
);
            }
        }

e:实现注册日志与留言日志记录

05233500_x8YP.gif
        public
 
void
 WriteInsert(
object
 id)
        {
            
if
 (ContainUrl(
"
reg.aspx
"
))
            {
                Write(id,
"
注册成功!
"
);
            }
            
else
            {
                Write(id,
string
.Format(
"
添加一行留言[id={0}]!
"
,id));
//
需要启用更多分支时,请使用"params object[] aopInfo信息[这个需要修改界面参数代码]"
            }
        }

 

 

三:切入原有留言版系统

1:将类库生成的AopLog.dll放到留言系统的Bin目录下

2:升级原来CYQ.Data.DLL的1.2版本到最新版本。[完全兼容,直接复盖升级]

3:配置文件appSettings项增加一行配置:<add key="Aop" value="AopLog,AopLog.AopLog"/>

 

四:运行结果

1:操作登陆、注册、留言!!!数据库记录结果如下图:

 

五:示例下载

 [为节省空间,删除了生成的dll,请重新引用dll编绎运行]

转载于:https://my.oschina.net/secyaher/blog/274192

你可能感兴趣的文章
MAVEN常用命令
查看>>
ansible的原理与初步使用
查看>>
(转)DOTA新版地图6.78发布:大幅改动 增两位新英雄
查看>>
Navicat For Mysql快捷键
查看>>
合成模式
查看>>
微信开发——授权
查看>>
HelloWorld App of ffmpeg JNI
查看>>
SAE 分布式session丢失的问题
查看>>
ubutnu1604安装nodejs和npm
查看>>
115个Java面试题和答案——终极列表(上)
查看>>
微软JavaScript和CSS压缩器AjaxMinifier
查看>>
寄生 视频,
查看>>
sql索引的优缺点
查看>>
聚类算法之单链接算法java实现
查看>>
如果repo连接不上gerrit.googlesource.com的时候,你还有其他选择
查看>>
浅谈haskell中Functor typeclass和普通typeclasses的区别
查看>>
Silverlight+WCF 新手实例 象棋 获取房间状态列表更新(二十一)
查看>>
banana pi与中科院先研院举行开源硬件介绍交流活动
查看>>
新产品 香蕉派 BPI-G1 WIFI,BT4.0,Zigbee三合一智能家居开发板
查看>>
Mysql奇怪的弹窗
查看>>