厚积薄发,丰富的公用类库积累,助你高效进行系统开发(9)—-各种常用辅助类
admin
2023-08-02 16:37:01
0

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。
本篇的公用类库的介绍主题是程序开发中常用到的各种格式转换或者数据验证的辅助类,内容范围可能比较广泛,包括XML操作、序列化及反序列化操作、命令行解析,枚举对象操作,数据格式验证等等,不过都是不可多得、好用的辅助类。本篇继续继续整理优化已有的共用类库,并继续发表随笔介绍公用类库的接口方法以及详细使用操作,力求给自己继续优化,积攒更丰富的公用类库资源,加深了解的同时,也给大家展现公用类库好的方面。
1、序列化、反序列化、节点等操作类辅助类 XmlHelper。
实现效果
1)本辅助类主要是用来方便实现XML序列化、反序列化、节点等操作。
2)序列化是指一个对象的实例可以被保存,保存成一个二进制串或者XML等格式字符串。反序列化这是从这些内容中还原为一个对象实例的操作。
3)要实现对象的序列化,首先要保证该对象可以序列化。而且,序列化只是将对象的属性进行有效的保存,对于对象的一些方法则无法实现序列化的。实现一个类可序列化的最简便的方法就是增加Serializable属性标记类。
4)DOM(文档对象模型)把层次中的每一个对象都称之为节点(NODE),以HTML超文本标记语言为例:整个文档的一个根就是,在DOM中可以使用
document.documentElement来访问它,它就是整个节点树的根节点(ROOT)。

实现代码
1)辅助类提供的方法接口如下所示:

///     
/// 构造函数    
///     
/// XML文件路径    
public XmlHelper(string XmlFile)   

#region 静态方法    

///     
/// 二进制序列化    
///     
/// 文件路径    
/// 对象实例    
///     
public static bool Serialize(string path, object obj)    

///     
/// XML序列化    
///     
/// 文件路径    
/// 对象实例    
///     
public static bool XmlSerialize(string path, object obj, Type type)    

///     
/// 二进制反序列化    
///     
/// 文件路径    
///     
public static object Deserialize(string path)    

///     
/// XML反序列化    
///     
/// 文件路径    
/// 对象类型    
///     
public static object XmlDeserialize(string path, Type type)   

#endregion   

#region 公用方法    

///     
/// 获取指定节点下面的XML子节点    
///     
/// XML节点    
///     
public XmlNodeList Read(string XmlPathNode)    

///     
/// 读取节点属性内容    
///     
/// XML节点    
/// 节点属性    
///     
public string Read(string XmlPathNode, string Attrib)    

///     
/// 获取元素节点对象    
///     
/// XML节点    
/// 元素节点名称    
///     
public XmlElement GetElement(string XmlPathNode, string elementName)    

///     
/// 获取元素节点的值    
///     
/// XML节点    
/// 元素节点名称    
///     
public string GetElementData(string XmlPathNode, string elementName)    

///     
/// 获取节点下的DataSet    
///     
/// XML节点    
///     
public DataSet GetData(string XmlPathNode)    

///     
/// 替换某节点的内容    
///     
/// XML节点    
/// 节点内容    
public void Replace(string XmlPathNode, string Content)    

///     
/// 删除节点    
///     
/// 节点    
public void Delete(string Node)    

///     
/// 插入一节点和此节点的一子节点    
///     
///     
///     
///     
///     
public void InsertNode(string MainNode, string ChildNode, string Element, string Content)    

///     
/// 插入一个节点带一个属性     
///     
/// 指定的XML节点    
/// 元素名称    
/// 属性名称    
/// 属性值    
/// 内容    
public void InsertElement(string MainNode, string Element, string Attrib, string AttribContent, string Content)    

///     
/// 插入XML元素    
///     
/// 指定的XML节点    
/// 元素名称    
/// 内容    
public void InsertElement(string MainNode, string Element, string Content)    

///     
/// 保存XML文档    
///    
public void Save()

2)辅助类XmlHelper的使用例子代码如下所示

SearchInfo searchInfo = new SearchInfo();    
searchInfo.FieldName = \"TestFeild\";    
searchInfo.FieldValue = \"TestValue\";    

string file = @\"C:\\searchInfo.xml\";    
XmlHelper.XmlSerialize(file, searchInfo, typeof(SearchInfo));    

SearchInfo info2FromXml = XmlHelper.XmlDeserialize(file, typeof(SearchInfo)) as SearchInfo;    
Console.WriteLine(\"{0} : {0}\", info2FromXml.FieldName, info2FromXml.FieldValue);

XML序列化文件如下所示,并能通过该文件反序列化到对象实例中。

3)辅助类XmlHelper操作节点的例子代码如下所示。

//bookstore.xml文件内容    
/*   
   
   
   
    Oberon\'s Legacy   
    Corets, Eva   
    5.95   
   
   
*/   
file = @\"c:\\bookstore.xml\";    
XmlHelper helper = new XmlHelper(file);    
string value = helper.Read(\"bookstore/book\", \"genre\");    
Console.WriteLine(value);//fantasy    

value = helper.Read(\"bookstore/book\", \"ISBN\");    
Console.WriteLine(value);//2-3631-4    

value = helper.GetElementData(\"bookstore/book\", \"title\");    
Console.WriteLine(value);//Oberon\'s Legacy       

XmlElement element = helper.GetElement(\"bookstore/book\", \"title\");    
element.InnerText = \"伍华聪\";    

DataSet ds = helper.GetData(\"bookstore/book\");    
ds.WriteXml(@\"C:\\ds.xml\");

2、序列化和反序列化操作辅助类 Serializer。
实现效果
1)本辅助类主要是用来方便实现序列化合反序列化操作。
2)序列化是指一个对象的实例可以被保存,保存成一个二进制串或者XML等格式字符串。反序列化这是从这些内容中还原为一个对象实例的操作。
本序列化和反序列化操作,提供二进制、XML格式、Soap格式等多种方式的操作,方便对对象实例进行各种序列化操作或者对各种格式文件的反序列化操作。

实现代码
1)辅助类提供的方法接口如下所示:

#region 各种格式的序列化操作    
///     
/// 序列化对象到二进制字节数组    
///     
/// 待序列化的对象    
///     
public static byte[] SerializeToBinary(object obj)    

///     
/// 序列化对象到指定的文件中    
///     
/// 待序列化的对象    
/// 文件路径    
/// 文件打开方式    
public static void SerializeToBinary(object obj, string path, FileMode mode)    

///     
/// 序列号对象到文件中,创建一个新文件    
///     
/// 待序列化的对象    
/// 文件路径    
public static void SerializeToBinary(object obj, string path)    

///     
/// 序列化对象到Soap字符串中    
///     
/// 待序列化的对象    
///     
public static string SerializeToSoap(object obj)    

///     
/// 序列化对象到Soap字符串中,并保存到文件    
///     
/// 待序列化的对象    
/// 文件路径    
/// 文件打开方式    
public static void SerializeToSoap(object obj, string path, FileMode mode)    

///     
/// 序列化对象到Soap字符串中,并保存到文件    
///     
/// 待序列化的对象    
/// 文件路径    
public static void SerializeToSoap(object obj, string path)    

///     
/// 序列化对象到XML字符串中    
///     
/// 待序列化的对象    
///     
public static string SerializeToXml(object obj)    

///     
/// 序列化对象到XML字符串,并保存到文件中    
///     
/// 待序列化的对象    
/// 文件路径    
/// 文件打开方式    
public static void SerializeToXmlFile(object obj, string path, FileMode mode)    

///     
/// 序列化对象到XML字符串,并保存到文件中    
///     
/// 待序列化的对象    
/// 文件路径    
public static void SerializeToXmlFile(object obj, string path)   

#endregion    


///     
/// 从指定的文件中反序列化到具体的对象    
///     
/// 对象的类型    
/// 文件路径    
///     
public static object DeserializeFromXmlFile(Type type, string path)    

///     
/// 从指定的XML字符串中反序列化到具体的对象    
///     
/// 对象的类型    
/// XML字符串    
///     
public static object DeserializeFromXml(Type type, string s)    

///     
/// 从指定的Soap协议字符串中反序列化到具体的对象    
///     
/// 对象的类型    
/// Soap协议字符串    
///     
public static object DeserializeFromSoap(Type type, string s)    

///     
/// 从指定的二进制字节数组中反序列化到具体的对象    
///     
/// 对象的类型    
/// 二进制字节数组    
///     
public static object DeserializeFromBinary(Type type, byte[] bytes)    

///     
/// 从指定的文件总,以二进制字节数组中反序列化到具体的对象    
///     
/// 对象的类型    
/// 二进制字节数组存储的文件    
///     
public static object DeserializeFromBinary(Type type, string path)    

///     
/// 获取对象的字节数组大小    
///     
/// 对象    
///     
public static long GetByteSize(object o)    

///     
/// 克隆一个对象    
///     
/// 对象    
///     
public static object Clone(object o)

2)辅助类的使用例子代码如下所示

 public class TestSerializeUtil    
{    
    public static string Execute()    
    {    
        string result = string.Empty;    
        result += \"使用SerializeUtil序列化及反序列化的辅助类:\" + \"\\r\\n\";    

        Person person = new Person();    
        person.Name = \"wuhuacong\";    
        person.Age = 20;    

        byte[] bytes = SerializeUtil.SerializeToBinary(person);    
        Person person2 = SerializeUtil.DeserializeFromBinary(typeof (Person), bytes) as Person;    
        result += ReflectionUtil.GetProperties(person2) + \"\\r\\n\";    

        string xml = SerializeUtil.SerializeToXml(person);    
        Person person3 = SerializeUtil.DeserializeFromXml(typeof (Person), xml) as Person;    
        result += \"person3:\\r\\n\" + ReflectionUtil.GetProperties(person3) + \"\\r\\n\";    

        result += \"SerializeUtil.GetByteSize(person3):\" + SerializeUtil.GetByteSize(person3) + \"\\r\\n\";    

        Person person4 = SerializeUtil.Clone(person3) as Person;    
        result += \"person4:\\r\\n\" + ReflectionUtil.GetProperties(person4) + \"\\r\\n\";    

        result += \"Util.AreObjectsEqual(person3, person4):\" + Util.AreObjectsEqual(person3, person4)+ \"\\r\\n\";    

        SerializeUtil.SerializeToXmlFile(person3, Util.CurrentPath + \"person3.xml\", FileMode.Create);    
        Person person5 = SerializeUtil.DeserializeFromXmlFile(typeof (Person), Util.CurrentPath + \"person3.xml\") as Person;    
        result += \"person5:\\r\\n\" + ReflectionUtil.GetProperties(person5) + \"\\r\\n\\r\\n\";    

        result += SerializeUtil.ReadFile(Util.CurrentPath + \"person3.xml\") + \"\\r\\n\\r\\n\";    
        result += SerializeUtil.ReadFileFromEmbedded(\"TestUtilities.EmbedFile.xml\") + \"\\r\\n\\r\\n\";    

        return result;    
    }    
}

3、实现命令行解析的常用操作的辅助类 CommandLine。
实现效果
1)本辅助类主要是用来方便实现命令行解析的常用操作,命令行的解析在很多情况下是非常必要的,如自动并带参数启动的操作等。
2)命令行参数。这包括两个列表,一个是参数对,一个是独立的参数。
3)参数是定义为键/值对。参数键必须以\’-\’, \’–\’或者\’\\\’开始,在参数和值之间必须有一个空格或者字符\’=\’。多余的空格将被忽略。参数后面必须跟着一个值,如果没有指定值,那么字符串\’true\’将被指定。如果值有空格,必须使用双引号来包含字符,否则字符不能被正确解析。

实现代码
1)辅助类提供的方法接口如下所示:

///     
/// 解析传递的命令行参数,并返回结果到一个CommandArgs对象。    
/// 假设命令行格式: CMD [param] [[-|--|\\]<arg>[[=]<value>]] [param]    
/// 例如:cmd first -o outfile.txt --compile second \\errors=errors.txt third fourth --test = \"the value\" fifth    
///     
/// 命令行参数数组    
/// 包含转换后的命令行对象CommandArgs   
public static CommandArgs Parse(string[] args)
///     
/// 包含解析的命令行参数。这包括两个列表,一个是参数对,一个是独立的参数。    
///     
public class CommandArgs    
{    
    ///     
    /// 返回参数/参数值的键值字典    
    ///     
    public Dictionary ArgPairs    

    ///     
    /// 返回独立的参数列表    
    ///     
    public List Params    
}

2)辅助类的使用例子代码如下所示

///     
/// 应用程序的主入口点。    
///     
[STAThread]    
static void Main(string[] args)    
{    
    //参数字符串:first -o outfile.txt --compile second \\errors=errors.txt third fourth --test = \"the value\" fifth    

    CommandArgs objArgs = CommandLine.Parse(args);    

    //键值参数列表,得到输出    
    //o:outfile.txt    
    //compile:second    
    //errors:errors.txt    
    //test:the value    
    foreach (string str in objArgs.ArgPairs.Keys)    
    {    
        Debug.WriteLine(string.Format(\"{0}:{1}\", str, objArgs.ArgPairs[str]));    
    }    


    //非键值参数列表:得到first third fourth fifth 共四个字符串    
    foreach (string str in objArgs.Params)    
    {    
        Debug.WriteLine(str);    
    }    

    Application.EnableVisualStyles();    
    Application.SetCompatibleTextRenderingDefault(false);    
    Application.Run(new Form1());    
}

3)输出结果如下所示

我们给程序输入命令行参数first -o outfile.txt –compile second \\errors=errors.txt third fourth –test = \”the value\” fifth,得到的输出结果如下所示。

o:outfile.txt
compile:second
errors:errors.txt
test:the value
first
third
fourth
fifth

4、枚举操作辅助类 EnumHelper。
实现效果
1)本辅助类主要是用来方便实现枚举的各种相关操作。
2)枚举操作,涉及字符串和枚举对象互转、获取枚举成员、获取名称和值集合、获取枚举值、枚举描述等操作。
3)枚举可以说是一种强类型的对象操作,比起使用古怪字符、或者数值等内容,具有强类型,编译时刻就确定等特点,在实际开发中,我们还可以使用中文枚举来方便实现各种操作。

实现代码
1)辅助类提供的方法接口如下所示:

///     
/// 通过字符串获取枚举成员实例    
///     
/// 枚举名,比如Enum1    
/// 枚举成员的常量名或常量值,    
/// 范例:Enum1枚举有两个成员A=0,B=1,则传入\"A\"或\"0\"获取 Enum1.A 枚举类型    
public static T GetInstance(string member)    

///     
/// 获取枚举成员名称和成员值的键值对集合    
///     
/// 枚举名,比如Enum1    
public static Dictionary GetMemberKeyValue()    

///     
/// 获取枚举所有成员名称    
///     
/// 枚举名,比如Enum1    
public static string[] GetMemberNames()    

///     
/// 获取枚举成员的名称    
///     
/// 枚举名,比如Enum1    
/// 枚举成员实例或成员值,    
/// 范例:Enum1枚举有两个成员A=0,B=1,则传入Enum1.A或0,获取成员名称\"A\"    
public static string GetMemberName(object member)    

///     
/// 获取枚举所有成员值    
///     
/// 枚举名,比如Enum1    
public static Array GetMemberValues()    

///     
/// 获取枚举成员的值    
///     
/// 枚举名,比如Enum1    
/// 枚举成员的常量名,    
/// 范例:Enum1枚举有两个成员A=0,B=1,则传入\"A\"获取0    
public static object GetMemberValue(string memberName)    

///     
/// 获取枚举的基础类型    
///     
/// 枚举类型    
public static Type GetUnderlyingType(Type enumType)    

///     
/// 检测枚举是否包含指定成员    
///     
/// 枚举名,比如Enum1    
/// 枚举成员名或成员值    
public static bool IsDefined(string member)    

///     
/// 返回指定枚举类型的指定值的描述    
///     
/// 枚举类型    
/// 枚举值    
///     
public static string GetDescription(System.Type t, object v)    

///     
/// 返回指定枚举类型的指定值的名称    
///     
/// 指定枚举类型    
/// 指定值    
///     
private static string GetName(System.Type t, object v)    

///     
/// 获取枚举类型的对应序号及描述名称    
///     
/// 枚举类型    
///     
public static SortedList GetStatus(System.Type t)

2)辅助类的使用例子代码如下所示

private void btnTestEnum_Click(object sender, EventArgs e)    
{    
    string desc = EnumHelper.GetDescription(typeof(SqlOperator), SqlOperator.Like);    
    MessageUtil.ShowTips(string.Format(\"SqlOperator.Like:{0}\", desc));    

    SortedList list = EnumHelper.GetStatus(typeof(SqlOperator));    
    StringBuilder sb = new StringBuilder();    
    foreach (int key in list.Keys)    
    {    
        sb.AppendFormat(\"key:{0} Value:{1} \\r\\n\", key, list[key]);    
    }    
    MessageUtil.ShowTips(sb.ToString());    
}

5、身份证相关操作辅助类 IDCardHelper。
实现效果
1)本辅助类主要是用来方便实现身份证的各种相关操作,验证身份证、15到18位身份证号码转换、提取省份、县市、地区区划、出生年月及判断男女等操作。
实现代码
1)辅助类提供的方法接口如下所示:

///     
/// 绑定身份证类别的名称    
///     
/// ComboBox控件    
public static void InitIdType(ComboBox cb)    

///     
/// 获取身份证类别的名称(居民身份证、军官证、士兵证、军官离退休证、境外人员身份证明、外交人员身份证明)    
///     
///     
public static DataTable CreateIDType()    

///     
/// 验证身份证结果    
///     
/// 身份证号码    
/// 正确的时候返回string.Empty    
public static string Validate(string idcard)    

///     
/// 15位身份证明号码转化成18位用来编码    
///     
/// 15位的身份证号码    
///     
public static string IdCard15To18(string idcard)    

///     
/// 获取身份证对应省份的区划    
///     
/// 身份证    
/// 头两位+4个0    
public static string GetProvince(string id)    

///     
/// 获取身份证对应县市的区划    
///     
/// 身份证    
/// 头4位+2个0    
public static string GetCity(string id)    

///     
/// 获取身份证对应地区的区划    
///     
/// 身份证    
/// 头6位    
public static string GetArea(string id)    

///     
/// 根据身份证判断是否男女    
///     
/// 身份证号码    
/// 返回\"男\"或者\"女\"    
public static string GetSexName(string id)    

///     
/// 根据身份证获取出生年月    
///     
/// 身份证号码    
/// 出生年月    
public static DateTime GetBirthday(string id)

2)辅助类的使用例子代码如下所示
例子涉及敏感信息,自己测试下即可,呵呵

6、各种输入格式验证辅助类 ValidateUtil。
实现效果
1)本辅助类主要是用来方便实现各种输入格式验证操作。
2)格式验证包括各种数字格式、中文检测、身份证、邮件、邮政编码、固定电话、手机、URL地址、IP地址、日期格式、GUID、Base64编码等格式验证。
3)本辅助类采用各种经过验证的正则表达式进行匹配,具有高效、准确的特点,请放心使用。

实现代码
1)辅助类提供的方法接口如下所示:

#region 用户名密码格式    

///     
/// 返回字符串真实长度, 1个汉字长度为2    
///     
/// 字符长度    
public static int GetStringLength(string stringValue)    

///     
/// 检测用户名格式是否有效    
///     
/// 用户名    
///     
public static bool IsValidUserName(string userName)    

///     
/// 密码有效性    
///     
/// 密码字符串    
///     
public static bool IsValidPassword(string password)   

#endregion   

#region 数字字符串检查    

///     
/// int有效性    
///     
static public bool IsValidInt(string val)    

///     
/// 是否数字字符串    
///     
/// 输入字符串    
///     
public static bool IsNumeric(string inputData)    

///     
/// 是否数字字符串    
///     
/// 输入字符串    
///     
public static bool IsNumber(string inputData)    

///     
/// 是否数字字符串 可带正负号    
///     
/// 输入字符串    
///     
public static bool IsNumberSign(string inputData)    

///     
/// 是否是浮点数    
///     
/// 输入字符串    
///     
public static bool IsDecimal(string inputData)    

///     
/// 是否是浮点数 可带正负号    
///     
/// 输入字符串    
///     
public static bool IsDecimalSign(string inputData)   

#endregion   

#region 中文检测    

///     
/// 检测是否有中文字符    
///     
public static bool IsHasCHZN(string inputData)    

///      
/// 检测含有中文字符串的实际长度     
///      
/// 字符串     
public static int GetCHZNLength(string inputData)   

#endregion   

#region 常用格式    

///     
/// 验证身份证是否合法  15 和  18位两种    
///     
/// 要验证的身份证    
public static bool IsIdCard(string idCard)    

///     
/// 是否是邮件地址    
///     
/// 输入字符串    
///     
public static bool IsEmail(string inputData)    

///     
/// 邮编有效性    
///     
public static bool IsValidZip(string zip)    

///     
/// 固定电话有效性    
///     
public static bool IsValidPhone(string phone)    

///     
/// 手机有效性    
///     
public static bool IsValidMobile(string mobile)    

///     
/// 电话有效性(固话和手机 )    
///     
public static bool IsValidPhoneAndMobile(string number)    

///     
/// Url有效性    
///     
static public bool IsValidURL(string url)    

///     
/// IP有效性    
///     
public static bool IsValidIP(string ip)    

///     
/// domain 有效性    
///     
/// 域名    
///     
public static bool IsValidDomain(string host)    

///     
/// 判断是否为base64字符串    
///     
public static bool IsBase64String(string str)    

///     
/// 验证字符串是否是GUID    
///     
/// 字符串    
///     
public static bool IsGuid(string guid)   

#endregion   

#region 日期检查    

///     
/// 判断输入的字符是否为日期    
///     
public static bool IsDate(string strValue)    

///     
/// 判断输入的字符是否为日期,如2004-07-12 14:25|||1900-01-01 00:00|||9999-12-31 23:59    
///     
public static bool IsDateHourMinute(string strValue)   

#endregion   

#region 其他    

///     
/// 检查字符串最大长度,返回指定长度的串    
///     
/// 输入字符串    
/// 最大长度    
///              
public static string CheckMathLength(string inputData, int maxLength)    

///     
/// 转换成 HTML code    
///     
public static string Encode(string str)    

///     
///解析html成 普通文本    
///     
public static string Decode(string str)

2)辅助类的使用例子代码如下所示

string[] qunList = lineString.Split(new char[] { \',\', \';\', \' \' });    
foreach (string qunNumber in qunList)    
{    
    if (!string.IsNullOrEmpty(qunNumber) && ValidateUtil.IsNumber(qunNumber))    
    {   
        #region 对每个号码进行查询    
        if (!QunDict.ContainsKey(qunNumber))    
        {    
            this.lstItems.Invoke(new MethodInvoker(delegate()    
            {    
                this.lstItems.Items.Add(qunNumber);    
                this.lstItems.Refresh();    
            }));    

            QunDict.Add(qunNumber, qunNumber);    
        }    
        else   
        {    
            skipCount++;    
        }    
        #endregion    
    }    
}

3)辅助类使用例子代码2如下所示

string src = CRegex.GetImgSrc(img);    
bool isurl = ValidateUtil.IsValidURL(src);    
if (isurl)    
{    
    continue;    
}

CHM帮助文档持续更新中,统一下载地址是: http://www.iqidi.com/download/commonshelp.rar
公用类库DLL+XML注释文件下载地址是:http://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...