当前位置: 首页 > 编程日记 > 正文

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②...

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②

上一讲我们做了日志与异常的结果显示列表,这一节我们讲要把他应用系统中来。

首先我们在App.Common类库中创建一个通用类ResultHelper,这个类里面写了,获取一个GUID,获取当前时间,处理字符串等操作,虽然我们目前要用到的一个就是获取GUID但是以后我们可能还要用到别的,所以我都把他放进入了

然后在App.Admin创建一个核心文件夹,Core,放入LogHandler这个类是主要是写入日志,避免在每次都要实例化这个类,我把他封装起来,大家一看就知道。

然后修改Controller的Create方法,代码如下一一给出。

using System;
using System.Web;
using System.Text.RegularExpressions;namespace App.Common
{public class ResultHelper{/// <summary>/// 创建一个全球唯一的32位ID/// </summary>/// <returns>ID串</returns>public static string NewId{get{string id = DateTime.Now.ToString("yyyyMMddHHmmssfffffff");string guid = Guid.NewGuid().ToString().Replace("-", "");id += guid.Substring(0, 10);return id;}}public static string NewTimeId{get{string id = DateTime.Now.ToString("yyyyMMddHHmmssfffffff");return id;}}/// <summary>/// 截取字符串/// </summary>/// <param name="value">字符串</param>/// <param name="length">剩下长度</param>/// <returns>指定字符串并加...</returns>public static string SubValue(string value, int length){if (value.Length > length){value = value.Substring(0, length); value = value + "..."; return NoHtml(value);}else { return NoHtml(value); }}//还原的时候public static string InputText(string inputString){if ((inputString != null) && (inputString != String.Empty)){inputString = inputString.Trim();//if (inputString.Length > maxLength) //inputString = inputString.Substring(0, maxLength); inputString = inputString.Replace("<br>", "\n");inputString = inputString.Replace("&", "&amp");inputString = inputString.Replace("'", "''");inputString = inputString.Replace("<", "&lt");inputString = inputString.Replace(">", "&gt");inputString = inputString.Replace("chr(60)", "&lt");inputString = inputString.Replace("chr(37)", "&gt");inputString = inputString.Replace("\"", "&quot");inputString = inputString.Replace(";", ";");return inputString;}else{return "";}}//添加的时候public static string OutputText(string outputString){if ((outputString != null) && (outputString != String.Empty)){outputString = outputString.Trim();outputString = outputString.Replace("&amp", "&");outputString = outputString.Replace("''", "'");outputString = outputString.Replace("&lt", "<");outputString = outputString.Replace("&gt", ">");outputString = outputString.Replace("&lt", "chr(60)");outputString = outputString.Replace("&gt", "chr(37)");outputString = outputString.Replace("&quot", "\"");outputString = outputString.Replace(";", ";");outputString = outputString.Replace("\n", "<br>");return outputString;}else{return "";}}/// <summary>/// 去除HTML标记/// </summary>/// <param name="NoHTML">包括HTML的源码 </param>/// <returns>已经去除后的文字</returns>public static string NoHtml(string Htmlstring){//删除脚本Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "", RegexOptions.IgnoreCase);//删除HTMLHtmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"([\r\n])[\s]+", "", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"<!--.*", "", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&(quot|#34);", "\"", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&(amp|#38);", "&", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&(lt|#60);", "<", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&(gt|#62);", ">", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&(nbsp|#160);", " ", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&(iexcl|#161);", "\xa1", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&(cent|#162);", "\xa2", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&(pound|#163);", "\xa3", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&(copy|#169);", "\xa9", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&#(\d+);", "", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&hellip;", "", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&mdash;", "", RegexOptions.IgnoreCase);Htmlstring = Regex.Replace(Htmlstring, @"&ldquo;", "", RegexOptions.IgnoreCase);Htmlstring.Replace("<", "");Htmlstring = Regex.Replace(Htmlstring, @"&rdquo;", "", RegexOptions.IgnoreCase);Htmlstring.Replace(">", "");Htmlstring.Replace("\r\n", "");Htmlstring = HttpContext.Current.Server.HtmlEncode(Htmlstring).Trim();return Htmlstring;}/// <summary>/// 格式化文本(防止SQL注入)/// </summary>/// <param name="str"></param>/// <returns></returns>public static string Formatstr(string html){System.Text.RegularExpressions.Regex regex1 = new System.Text.RegularExpressions.Regex(@"<script[\s\S]+</script *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);System.Text.RegularExpressions.Regex regex2 = new System.Text.RegularExpressions.Regex(@" href *= *[\s\S]*script *:", System.Text.RegularExpressions.RegexOptions.IgnoreCase);System.Text.RegularExpressions.Regex regex3 = new System.Text.RegularExpressions.Regex(@" on[\s\S]*=", System.Text.RegularExpressions.RegexOptions.IgnoreCase);System.Text.RegularExpressions.Regex regex4 = new System.Text.RegularExpressions.Regex(@"<iframe[\s\S]+</iframe *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);System.Text.RegularExpressions.Regex regex5 = new System.Text.RegularExpressions.Regex(@"<frameset[\s\S]+</frameset *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);System.Text.RegularExpressions.Regex regex10 = new System.Text.RegularExpressions.Regex(@"select", System.Text.RegularExpressions.RegexOptions.IgnoreCase);System.Text.RegularExpressions.Regex regex11 = new System.Text.RegularExpressions.Regex(@"update", System.Text.RegularExpressions.RegexOptions.IgnoreCase);System.Text.RegularExpressions.Regex regex12 = new System.Text.RegularExpressions.Regex(@"delete", System.Text.RegularExpressions.RegexOptions.IgnoreCase);html = regex1.Replace(html, ""); //过滤<script></script>标记html = regex2.Replace(html, ""); //过滤href=javascript: (<A>) 属性html = regex3.Replace(html, " _disibledevent="); //过滤其它控件的on...事件html = regex4.Replace(html, ""); //过滤iframehtml = regex10.Replace(html, "s_elect");html = regex11.Replace(html, "u_pudate");html = regex12.Replace(html, "d_elete");html = html.Replace("'", "");html = html.Replace("&nbsp;", " ");return html;}/// <summary>/// 检查SQL语句合法性/// </summary>/// <param name="sql"></param>/// <returns></returns>public static bool ValidateSQL(string sql, ref string msg){if (sql.ToLower().IndexOf("delete") > 0){msg = "查询参数中含有非法语句DELETE";return false;}if (sql.ToLower().IndexOf("update") > 0){msg = "查询参数中含有非法语句UPDATE";return false;}if (sql.ToLower().IndexOf("insert") > 0){msg = "查询参数中含有非法语句INSERT";return false;}return true;}//获取当前时间public static DateTime NowTime{get {return DateTime.Now;}}/// <summary>/// 将日期转换成字符串/// </summary>/// <param name="dt">日期</param>/// <returns>字符串</returns>public static string DateTimeConvertString(DateTime? dt){if (dt == null){return "";}else{return Convert.ToDateTime(dt.ToString()).ToShortDateString();}}/// <summary>/// 将字符串转换成日期/// </summary>/// <param name="str">字符串</param>/// <returns>日期</returns>public static DateTime? StringConvertDatetime(string str){if (str == null){return null ;}else{try{return Convert.ToDateTime(str);}catch {return null;}}}public static string GetUserIP(){if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)return System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(new char[] { ',' })[0];elsereturn System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];}}
}
ResultHelper
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using App.Common;
using App.DAL;
using App.IBLL;
using App.Models;
using Microsoft.Practices.Unity;namespace App.Admin
{public static class LogHandler{[Dependency]public static ISysLogBLL logBLL { get; set; }/// <summary>/// 写入日志/// </summary>/// <param name="oper">操作人</param>/// <param name="mes">操作信息</param>/// <param name="result">结果</param>/// <param name="type">类型</param>/// <param name="module">操作模块</param>public static void WriteServiceLog(string oper, string mes, string result, string type, string module){SysLog entity = new SysLog();entity.Id = ResultHelper.NewId;entity.Operator = oper;entity.Message = mes;entity.Result = result;entity.Type = type;entity.Module = module;entity.CreateTime = ResultHelper.NowTime;using (SysLogRepository logRepository = new SysLogRepository()){logRepository.Create(entity);}}}
}
LogHandler
 [HttpPost]public JsonResult Create(SysSampleModel model){if (m_BLL.Create(model)){LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name, "成功", "创建", "样例程序");return Json(1, JsonRequestBehavior.AllowGet);}else{LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name, "失败", "创建", "样例程序");return Json(0, JsonRequestBehavior.AllowGet);}}
SysSampleController

同时App.Common要引用程序集System.Web

运行添加一条记录,然后打开我们的日志模块,OK,日志记录完成了,有点简单。

接下来是异常,上一讲说到,异常我们放在BLL中处理,然后我们把错误或者异常信息返回到Controller中被日志记录,当然异常他是在BLL层被记录的。

我们需要一个异常的集合类,来记录BLL层和DAL层,有时候DAL也要处理异常,所以我们也要用到ref 引用传递,貌似ref我们很喜欢,呵呵

见代码,在App.Common创建一个异常集合类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace App.Common
{public class ValidationError{public ValidationError() { }public string ErrorMessage { get; set; }}public class ValidationErrors : List<ValidationError>{/// <summary>/// 添加错误/// </summary>/// <param name="errorMessage">信息描述</param>public void Add(string errorMessage){base.Add(new ValidationError { ErrorMessage = errorMessage });}/// <summary>/// 获取错误集合/// </summary>public string Error{get {string error = "";this.All(a => {error += a.ErrorMessage;return true;});return error;} }}
}
ValidationErrorHelper.cs

我们也要创建一个封装好的异常写入,类似与Log的LogHandler封装但我们放在BLL中,因为我们以后的其他项目的BLL要引用,这一步要考虑到。
在BLL中创建文件夹Core,写入以下类,BLL引用程序集System.Web里面用到了http的一些方法

using System;
using System.Web.Configuration;
using App.Models;
using System.IO;
using System.Text;
using App.Common;namespace App.BLL.Core
{/// <summary>/// 写入一个异常错误/// </summary>/// <param name="ex">异常</param>public static class ExceptionHander{/// <summary>/// 加入异常日志/// </summary>/// <param name="ex">异常</param>public static void WriteException(Exception ex){try{using (DBContainer db = new DBContainer()){SysException model = new SysException(){Id = ResultHelper.NewId,HelpLink = ex.HelpLink,Message = ex.Message,Source = ex.Source,StackTrace = ex.StackTrace,TargetSite = ex.TargetSite.ToString(),Data =ex.Data.ToString(),CreateTime = ResultHelper.NowTime};db.SysException.AddObject(model);db.SaveChanges();}}catch (Exception ep){try{//异常失败写入txtstring path = @"~/exceptionLog.txt";string txtPath = System.Web.HttpContext.Current.Server.MapPath(path);//获取绝对路径using (StreamWriter sw = new StreamWriter(txtPath, true, Encoding.Default)){sw.WriteLine((ex.Message + "|" + ex.StackTrace + "|" + ep.Message + "|" + DateTime.Now.ToString()).ToString());sw.Dispose();sw.Close();}return;}catch { return; }}}}}
ExceptionHander

此异常当处理也异常时候,将在网站根目录下写入一个txt文件。
创建一个全局变量

ValidationErrors errors = new ValidationErrors();

我们要用引用传递,所以要修改IBLL和BLL的Create方法,如下
ISysSampleBLL  :  bool Create(ref ValidationErrors errors, SysSampleModel model);

SysSampleBLL   :

 /// <summary>/// 创建一个实体/// </summary>/// <param name="errors">持久的错误信息</param>/// <param name="model">模型</param>/// <returns>是否成功</returns>/// <summary>/// 创建一个实体/// </summary>/// <param name="errors">持久的错误信息</param>/// <param name="model">模型</param>/// <returns>是否成功</returns>public bool Create(ref ValidationErrors errors, SysSampleModel model){try{SysSample entity = Rep.GetById(model.Id);if (entity != null){errors.Add("主键重复");return false;}entity = new SysSample();entity.Id = model.Id;entity.Name = model.Name;entity.Age = model.Age;entity.Bir = model.Bir;entity.Photo = model.Photo;entity.Note = model.Note;entity.CreateTime = model.CreateTime;if (Rep.Create(entity) == 1){return true;}else{errors.Add("插入失败");return false;}}catch (Exception ex){errors.Add(ex.Message);ExceptionHander.WriteException(ex);return false;}}

修改Controller

 [HttpPost]public JsonResult Create(SysSampleModel model){if (m_BLL.Create(ref errors, model)){LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name, "成功", "创建", "样例程序");return Json(1, JsonRequestBehavior.AllowGet);}else{string ErrorCol = errors.Error;LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name + "," + ErrorCol, "失败", "创建", "样例程序");return Json(0, JsonRequestBehavior.AllowGet);}}

注意:ExceptionHander.WriteException(ex);这里是写入异常信息

OK,你现在可以创建一条新的记录和插入一个ID大于50个字符的记录,让他记录日志和异常了。

显然我们的失败错误提示已经不符合国情了。我们返回的json格式是0和1我们要返回多个值了,比如1和成功创建,0和失败了啊,这样的2个值怎么办?

controller能把datagrid传过来的东西用类来接受,那么反过来想,js也能把controller发出去的值分解,创建一个序列化的类

在App.Common类库中创建JsonHandler帮助类,里面有2个重载,一个是返回3个值一个是2个值的。

所以当我们要返回订单的数量和总价格的时候,我们将用到类似的手段

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace App.Common
{public class JsonHandler{public static JsonMessage CreateMessage(int ptype,string pmessage,string pvalue){JsonMessage json = new JsonMessage(){type = ptype,message = pmessage,value = pvalue};return json;}public static JsonMessage CreateMessage(int ptype, string pmessage){JsonMessage json = new JsonMessage(){type = ptype,message = pmessage,};return json;}}public class JsonMessage{public int type{get;set;}public string message{get;set;}public string value{get;set;}}
}
JsonHandler

再次修改Controller的Create

  [HttpPost]public JsonResult Create(SysSampleModel model){if (m_BLL.Create(ref errors, model)){LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name, "成功", "创建", "样例程序");return Json(JsonHandler.CreateMessage(1, "插入成功"), JsonRequestBehavior.AllowGet);}else{string ErrorCol = errors.Error;LogHandler.WriteServiceLog("虚拟用户", "Id:" + model.Id + ",Name:" + model.Name + "," + ErrorCol, "失败", "创建", "样例程序");return Json(JsonHandler.CreateMessage(0, "插入失败" + ErrorCol), JsonRequestBehavior.AllowGet);}}

修改SysSample的Create的JS部分

<script type="text/javascript">$(function () {$("#btnSave").click(function () {if ($("#CreateForm").valid()) {$.ajax({url: "/SysSample/Create",type: "Post",data: $("#CreateForm").serialize(),dataType: "json",success: function (data) {if (data.type == 1) {window.parent.frameReturnByMes(data.message);window.parent.frameReturnByReload(true);window.parent.frameReturnByClose()}else {window.parent.frameReturnByMes(data.message);}}});}return false;});});</script>

由于时间关系,这一讲就先到这里吧!这一讲其实比较仓促。不懂的留言

你需要继续做的就是在删除,编辑等操作也加入这些的。这点留给大家自己表现吧....

下一讲是全局异常的捕获。

相关文章:

爬取猫眼怦然心动电影评论

作业要求来源&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159 可以用pandas读出之前保存的数据&#xff1a; newsdf pd.read_csv(rF:\duym\gzccnews.csv) 一.把爬取的内容保存到数据库sqlite3 import sqlite3with sqlite3.connect(gzccnewsdb.sqli…

TCMalloc(Thread-Caching malloc) 基本设计原理

文章目录背景如何使用架构概览1. TCMalloc Front-end1.1 小对象和大对象的内存分配过程1.2 内存释放过程1.3 Per-CPU mode1.4 Per-thread mode1.5 per-cpu 和 per-thread 运行时内存管理算法对比2. TCMalloc Middle-end2.1 Transfer Cache2.2 Central Free List2.3 Pagemap 和 …

Java项目:控制台商城系统(java+打印控制台)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能简介&#xff1a; 客户信息管理、商品信息管理、购物信息管理、退出系统 显示系统主菜单&#xff1a; public class SystemMenu {//显示系统主菜单public void showMainMenu(){System.out.println(&qu…

PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)

PAT (Basic Level) Practise &#xff08;中文&#xff09;-1025. 反转链表 (25) http://www.patest.cn/contests/pat-b-practise/1025 给定一个常数K以及一个单链表L&#xff0c;请编写程序将L中每K个结点反转。例如&#xff1a;给定L为1→2→3→4→5→6&#xff0c;K为3&am…

初识Quartz(三)

为什么80%的码农都做不了架构师&#xff1f;>>> 简单作业&#xff1a; package quartz_project.example3;import java.util.Date;import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.Job…

内存分配器设计的演进

文章目录栈内存空间是否够用系统调用申请内存最简单的内存分配器实现 -- bump allocator可扩容的 Bump alloactor通过free-list 管理的 allocator通过size-buckets 维护多个free-list 的 allocatorCache friendly allocator需要考虑更多问题的allocator性能易用性本文希望描述一…

Android OpenGL ES(十一)绘制一个20面体 .

前面介绍了OpenGL ES所有能够绘制的基本图形&#xff0c;点&#xff0c;线段和三角形。其它所有复杂的2D或3D图形都是由这些基本图形构成。 本例介绍如何使用三角形构造一个正20面体。一个正20面体&#xff0c;有12个顶点&#xff0c;20个面&#xff0c;30条边构成&#xff1a;…

Java项目:学生选课系统(java+javaweb+jdbc)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a; 用户菜单、学生管理、教师管理、课程管理、成绩排名查询 学生管理控制层&#xff1a; Controller RequestMapping("/student") public class StudentController {private …

Xtrabackup对mysql全备以及增量备份实施

Xtrabackup对mysql全备以及增量备份实施1.完全备份与恢复本文使用的是centos5.8 64位系统&#xff0c;mysql 使用5.5.35.如果要使用一个最小权限的用户进行备份&#xff0c;可基于以下&#xff1a;mysql> createuser bkuserlocalhost identified by redhat;mysql> grant …

js浅拷贝和深拷贝

浅度拷贝&#xff1a;复制一层对象的属性&#xff0c;并不包括对象里面的为引用类型的数据&#xff0c;当改变拷贝的对象里面的引用类型时&#xff0c;源对象也会改变。 深度拷贝&#xff1a;重新开辟一个内存空间&#xff0c;需要递归拷贝对象里的引用&#xff0c;直到子属性都…

关于 fallocate 文件系统预分配 的一些细粒度测试

文章目录Rocksdb 中的预分配Fallocate in rocksdb 性能测试Fallocate 使用 以及 对应配置的行为API 使用不同 Mode 的行为分配磁盘空间释放磁盘空间折叠/裁剪 文件内容清零文件 扩容文件Rocksdb 中的预分配 预分配文件存储空间 在存储引擎中用的还是比较频繁的&#xff0c;尤…

mac 使用nvm安装node

1.curl https://raw.github.com/creationix/nvm/master/install.sh | sh2。vi ~/.bash_profile 添加&#xff1a;source /Users/dujie/.nvm/nvm.sh nvm install 0.10.24 nvm use 0.10.24 # 默認使用 0.10.24 版本&#xff0c;否則每次關掉 Terminal 就得重新 nvm use 一次 $…

Java项目:人事管理系统(java+javaweb+jdbc)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a; 登录、新增、修改、离职 员工管理控制层&#xff1a; Controller RequestMapping("/employee") public class EmployeeController {Autowiredprivate IEmployeeService em…

转:async await 的前世今生 ; 异步 线程 多线程

写的非常好,改天搬过来

ubuntu14.04初体会

2014年4月17日ubuntu新的长期支持版14.04公布了&#xff0c;中国时间18日一早就能够下载到。18日晚。在我的X200上安装上了14.04&#xff0c;算是比較早一批体会到14.04正式版的人吧。对照12.04&#xff0c;14.04提升的执行速度非常明显&#xff0c;界面改善也是令人眼前一亮&a…

Linux 下获取本机所有网卡 以及 网卡对应ip 列表

简单record 一下 #include <arpa/inet.h> // struct sockaddr_in #include <errno.h> #include <net/if.h> // struct ifreq and struct if_nameindex #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/i…

Java项目:植物大战僵尸(java+swing)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能简介&#xff1a; 植物大战僵尸、冒险模式、生存模式、解谜模式 小车服务类&#xff1a; public class CarThread extends Thread{private boolean flagtrue;private int x;private int y;private JL…

秋实大哥の恋爱物语

//裸kmp&#xff0c;劳资居然不会写&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 题意&#xff1a;中文题面自己看 解&#xff1a;差分裸kmp 因为可以上下移动&#xff0c;所以只要变化趋势相符就行&#xff0c;于是我们先做一个差分&#xff0c…

《马哥出品高薪linux运维教程》wingkeung学习笔记-linux基础入门课程5

命令&#xff1a;内部命令&#xff1a;由shell程序自带的命令叫做内部命令&#xff1b;外部命令&#xff1a;在系统的某个路径下&#xff0c;有一个与命令同名的可执行程序叫做外部命令。查看内外部命令的命令&#xff1a;type 命令命令选项&#xff1a;用于调整命令执行行为的…

八、LaTex中的表格

转载于:https://www.cnblogs.com/invisible2/p/10813964.html

基于持久内存的 单机上亿(128B)QPS -- 持久化 k/v 存储引擎

文章目录性能数据设计背景设计架构Hash 索引结构 及 PMEM空间管理形态基本API 及 实现API初始化流程写流程读流程删除流程PMEM Allocator设计主要组件空间分配流程空间释放图数据库 on KVDK 性能性能数据 这个kv 存储引擎是持久化的存储引擎&#xff0c;存储介质是PMEM&#x…

SCALA当的trait

不是特别懂&#xff0c;但感觉和RUBY当中的MIX-IN功能有几分相似&#xff0c;这又扯到了多重继承及JAVA当中的接口虚拟类了。。 package com.hengheng.scalaclass UseTrait {} trait Logger {def log(msg : String) {println("log : " msg)} } trait ConsoleLogger …

Java项目:贪吃蛇游戏(java+swing)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能简介&#xff1a; 贪吃蛇游戏 大嘴鱼洁面类。完成大嘴鱼的界面的绘制: /*** 大嘴鱼洁面类。完成大嘴鱼的界面的绘制。*/ public class BigMouthFishFrame extends JFrame{private FishPool pool null;…

使用Ext Form自动绑定Html中的Form元素

2019独角兽企业重金招聘Python工程师标准>>> Java代码 //把ext 对象绑定在Html Form元素时的ext属性中 Ext.override(Ext.Component, { initComponent :function(){ this.on(render, function(){ if(this.el) Ext.getDom(this.el).ext this; …

Directx11 教程(2) 基本的windows应用程序框架(2)

Directx11 教程(2) 基本的windows应用程序框架(2) 原文:Directx11 教程(2) 基本的windows应用程序框架(2)在本教程中&#xff0c;我们把前面一个教程的代码&#xff0c;进行封装。把初始化函数&#xff0c;Run函数&#xff0c;窗口回调函数&#xff0c;ShutdownWindows函数等封…

Rocksdb的事务(二):完整事务体系的 详细实现

文章目录1. 基本事务操作1.1 TransactionDB -- Pessimistic1.2 OptimisticTransactionDB1.3 Read Uncommitted1.4 SavePoint 回滚部分事务操作1.5 SetSnapshot1.6 GetForUpdate1.7 RepeatableRead2. 实现2.1 WBWI(write batch with index) & WB(write batch)2.2 Pessimisti…

关于学习编程的一些看法

1、看书&#xff0c;书上的代码一串一串的对吧&#xff1f;是不是很不好记&#xff1f;是不是觉得如果自己把这些代码都敲一遍很浪费时间&#xff1f;其实对于一些完全没有任何基础的人来说&#xff0c;全部敲一遍不失为一种简单的入门方法。对于有一点基础的人来说&#xff0c…

Java项目:日历万年历(java+swing)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能简介&#xff1a; 万年历 启动类&#xff1a; public class CalendarMainClass { public static void main(String args[]) { try { UIManager.setLookAndFeel("com.sun.java.swing.pl…

求大神给解释一下H3C ospf 双塔奇兵

转载于:https://blog.51cto.com/2807200/1364566

活着是为了什么?

活着是为了死亡&#xff0c;死亡才是完美&#xff0c;才是永恒。 死亡时将一无所有&#xff0c;所以活着不是为了能带走什么&#xff0c;而应该是能留下什么&#xff0c;这才是人活着的意义&#xff0c;多少人能想明白呢&#xff1f; 胡建龙转载于:https://www.cnblogs.com/hjl…