zoukankan      html  css  js  c++  java
  • CYQ.Data 轻量数据层之路 应用示例三 Aop切入留言系统操作日志(二十七)

    前言:

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

    正文步骤:

    一:建表

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

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

    创建ActionLogs表
    CREATE TABLE [dbo].[ActionLogs](
        
    [ID] [int] IDENTITY(1,1NOT 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 = OFFON [PRIMARY]
    ON [PRIMARY]

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

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

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

        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,并预先留下方法接口:

    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实现方法

    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

           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:插入表数据方法封装

            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:实现注册日志与留言日志记录

            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编绎运行]

    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- ApiWrapper
    Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger
    Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- AIDL
    Android Stutio -- 编译报错: Error:File path too long on Windows, keep below 240
    Android -- 手势操作识别
    Android -- 屏幕适配
    Android -- android:configChanges
    Java -- Date相关
    Java -- File
    links
  • 原文地址:https://www.cnblogs.com/cyq1162/p/1845708.html
Copyright © 2011-2022 走看看