step by step 之餐饮管理系统五(Util模块)

这段时间一直在修改日志模块,现在基本上写好了,也把注释什么的都加上了,昨天邮件发送给mark的园友一直报失败,老是退回来,真是报歉,如下图所示:

没有办法,只好放这里了,想看源代码的请猛戳这里

如果有什么问题,欢迎跟我交流!

从今天开始写Util模块,这个模块几乎所有的系统项目都需要的,想减少重复代码的编写,就依靠这个模块了.大的模块主要是以下几个方面:

1.加解密

这个我也不多说了,也就是MD5等加密算法:

 using System;
    using System.Security.Cryptography;
    using System.Text;

    /// <summary>
    /// 加解密相关操作类
    /// </summary>
    /// <date>2012-02-20</date>
    /// <author>xucj</author>
    public class Cryptography
    {
        private const string DefaultKey = "OD";

        /// <summary>
        /// 构造方法
        /// </summary>
        public Cryptography()
        {
        }

        /// <summary>
        /// 使用缺省密钥字符串加密
        /// </summary>
        /// <param name="original">明文</param>
        /// <returns>密文</returns>
        public static string Encrypt(string original)
        {
            return Encrypt(original, DefaultKey);
        }

        /// <summary>
        /// 使用缺省密钥解密
        /// </summary>
        /// <param name="original">密文</param>
        /// <returns>明文</returns>
        public static string Decrypt(string original)
        {
            return Decrypt(original, DefaultKey, System.Text.Encoding.Default);
        }

        /// <summary>
        /// 使用给定密钥解密
        /// </summary>
        /// <param name="original">密文</param>
        /// <param name="key">密钥</param>
        /// <returns>明文</returns>
        public static string Decrypt(string original, string key)
        {
            return Decrypt(original, key, System.Text.Encoding.Default);
        }

        /// <summary>
        /// 使用缺省密钥解密,返回指定编码方式明文
        /// </summary>
        /// <param name="original">密文</param>
        /// <param name="encoding">编码方式</param>
        /// <returns>明文</returns>
        public static string Decrypt(string original, Encoding encoding)
        {
            return Decrypt(original, DefaultKey, encoding);
        }

        /// <summary>
        /// 使用给定密钥加密
        /// </summary>
        /// <param name="original">原始文字</param>
        /// <param name="key">密钥</param>
        /// <returns>密文</returns>
        public static string Encrypt(string original, string key)
        {
            byte[] buff = System.Text.Encoding.Default.GetBytes(original);
            byte[] kb = System.Text.Encoding.Default.GetBytes(key);

            return Convert.ToBase64String(Encrypt(buff, kb));
        }

        /// <summary>
        /// 使用给定密钥解密
        /// </summary>
        /// <param name="encrypted">密文</param>
        /// <param name="key">密钥</param>
        /// <param name="encoding">字符编码方案</param>
        /// <returns>明文</returns>
        public static string Decrypt(string encrypted, string key, Encoding encoding)
        {
            byte[] buff = Convert.FromBase64String(encrypted);
            byte[] kb = System.Text.Encoding.Default.GetBytes(key);

            return encoding.GetString(Decrypt(buff, kb));
        }

        /// <summary>
        /// 生成MD摘要
        /// </summary>
        /// <param name="original">数据源</param>
        /// <returns>摘要</returns>
        private static byte[] MakeMD(byte[] original)
        {
            MD5CryptoServiceProvider hashmd = new MD5CryptoServiceProvider();
            byte[] keyhash = hashmd.ComputeHash(original);
            hashmd = null;

            return keyhash;
        }

        /// <summary>
        /// 使用给定密钥加密
        /// </summary>
        /// <param name="original">明文</param>
        /// <param name="key">密钥</param>
        /// <returns>密文</returns>
        private static byte[] Encrypt(byte[] original, byte[] key)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.Key = MakeMD(key);
            des.Mode = CipherMode.ECB;

            return des.CreateEncryptor().TransformFinalBlock(original, 0, original.Length);
        }

        /// <summary>
        /// 使用给定密钥解密数据
        /// </summary>
        /// <param name="encrypted">密文</param>
        /// <param name="key">密钥</param>
        /// <returns>明文</returns>
        private static byte[] Decrypt(byte[] encrypted, byte[] key)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.Key = MakeMD(key);
            des.Mode = CipherMode.ECB;

            return des.CreateDecryptor().TransformFinalBlock(encrypted, 0, encrypted.Length);
        }

        /// <summary>
        /// 使用给定密钥加密
        /// </summary>
        /// <param name="original">原始数据</param>
        /// <returns>密文</returns>
        private static byte[] Encrypt(byte[] original)
        {
            byte[] key = System.Text.Encoding.Default.GetBytes(DefaultKey);

            return Encrypt(original, key);
        }

        /// <summary>
        /// 使用缺省密钥解密数据
        /// </summary>
        /// <param name="encrypted">密文</param>
        /// <returns>明文</returns>
        private static byte[] Decrypt(byte[] encrypted)
        {
            byte[] key = System.Text.Encoding.Default.GetBytes(DefaultKey);

            return Decrypt(encrypted, key);
        }

        public static string SimpEncrypt(string str)
        {
            StringBuilder asc = new StringBuilder();
            for (int i = 0; i < str.Length; i++)
            {
                int b = char.Parse(str.Substring(i, 1)) + ‘\x0003‘;
                asc.Append((char)b);
            }
            return asc.ToString();
        }

        public static string SimpUnEncrypt(string str)
        {
            StringBuilder asc = new StringBuilder();
            for (int i = 0; i < str.Length; i++)
            {
                int b = char.Parse(str.Substring(i, 1)) - ‘\x0003‘;
                asc.Append((char)b);
            }
            return asc.ToString();
        }
    }

2.配置文件相关操作

xml,ini配置文件的读写方法:

 using System;
    using System.Text;
    using System.Runtime.InteropServices;
using System.Collections;
    using System.IO;
    using System.Collections.Generic;

    #region 配置文件读写操作类

    /// <summary>
    /// 配置文件读写操作类
    /// </summary>
    /// <date>2012-02-15</date>
    /// <author>xucj</author>
    public class IniFileHelper
    {
        #region  字段

        private string path;

        #endregion

        #region 构造函数

        public IniFileHelper(string iniFilePath)
        {
            path = iniFilePath;
        }

        #endregion

        #region 引用外部库

        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);

        #endregion

        #region  写入INI文件

        /// <summary>
        /// 写入INI文件
        /// </summary>
        /// <param name="section">段名</param>
        /// <param name="key">键名</param>
        /// <param name="value">键值</param>
        public void WriteValue(string section, string key, string value)
        {
            WritePrivateProfileString(section, key, value, this.path);
        }

        #endregion

        #region 删除ini配置

        /// <summary>
        /// 删除ini文件下所有段落
        /// </summary>
        public void ClearAllSection()
        {
            WriteValue(null, null, null);
        }
        /// <summary>
        /// 删除ini文件下personal段落下的所有键
        /// </summary>
        /// <param name="Section"></param>
        public void ClearSection(string Section)
        {
            WriteValue(Section, null, null);
        }
        #endregion

        #region 读取INI文件

        /// <summary>
        /// 读取INI文件
        /// </summary>
        /// <param name="section"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public string ReadValue(string section, string key)
        {
            StringBuilder temp = new StringBuilder(255);
            int i = GetPrivateProfileString(section, key, "", temp, 255, this.path);

            return temp.ToString();
        }

        private byte[] ReadValues(string section, string key)
        {
            byte[] temp = new byte[255];
            int i = GetPrivateProfileString(section, key, "", temp, 255, this.path);

            return temp;
        }

        /// <summary>
        /// 读取ini文件的所有段落名
        /// </summary>
        private string[] ReadValues()
        {
            byte[] allSection = ReadValues(null, null);

            return ByteToString(allSection);
        }

        /// <summary>
        /// 转换byte[]类型为string[]数组类型
        /// </summary>
        /// <param name="sectionByte"></param>
        /// <returns></returns>
        private string[] ByteToString(byte[] sectionByte)
        {
            ASCIIEncoding ascii = new ASCIIEncoding();
            //编码所有key的string类型
            string sections = ascii.GetString(sectionByte);
            //获取key的数组
            string[] sectionList = sections.Split(new char[1] { ‘\0‘ });

            return sectionList;
        }

        /// <summary>
        /// 读取ini文件的某段落下所有键名
        /// </summary>
        private string[] ReadValues(string section)
        {
            byte[] sectionByte = ReadValues(section, null);

            return ByteToString(sectionByte);
        }

        #endregion

        #region 不使用API方法

        private Dictionary<string, string> configInfo = new Dictionary<string,string>();        //* 存放Ini文件配制信息

        public int Count { get { return configInfo.Count; } }
        public string this[string key]
        {
            get
            {
                if (configInfo.ContainsKey(key))
                {
                    return configInfo[key].ToString();
                }
                else
                {
                    return "No this key-value";
                }
            }
        }

        /// <summary>
        /// 读取指定INI文件中的配置信息
        /// </summary>
        /// <param name="file">配置文件的完整路径名</param>
        /// <param name="section">配置文件中的节名 "[" + section + "]"形式</param>
        public IniFileHelper(string file, string section)
        {

            string Section = "[" + section + "]";
            LoadIniFile(file, Section);
        }

        /// <summary>
        /// 读取ini文件,以HashTable的格式存放
        /// </summary>
        /// <param name="filePath">ini文件路径</param>
        /// <param name="section">ini读取的段名</param>
        private void LoadIniFile(string filePath, string section)
        {
            try
            {
                StreamReader sr = new StreamReader(filePath, System.Text.Encoding.Default);

                string readLine = null;
                bool IsReadEnd = false;
                string[] keys;

                while ((readLine = sr.ReadLine()) != null)
                {
                    if (readLine == section)
                    {
                        while ((readLine = sr.ReadLine()) != null)
                        {
                            if(readLine != "")
                            {
                                if (readLine.Substring(0, 1) == "[")
                                {
                                    IsReadEnd = true;
                                    break;
                                }
                                keys = readLine.Split(‘=‘);
                                configInfo[keys[0].Trim()] = keys[1];
                            }
                        }
                    }
                    if (IsReadEnd)
                    {
                        break;
                    }
                }
                sr.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                configInfo.Clear();
            }
        }
        #endregion
    }

    #endregion

3.序列化

这个主要是可序列化字典:

 /// <summary>
    /// 支持XML序列化的泛型Dictionary类
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    /// <typeparam name="TValue"></typeparam>
    [XmlRoot("Dictionary")]
    [Serializable()]
    public class SerializableDictionary<TKey, TValue>
        : Dictionary<TKey, TValue>, IXmlSerializable
    {
        #region
        public SerializableDictionary()
            : base()
        {
        }

        public SerializableDictionary(IDictionary<TKey, TValue> dictionary)
            : base(dictionary)
        {
        }

        public SerializableDictionary(IEqualityComparer<TKey> comparer)
            : base(comparer)
        {
        }

        public SerializableDictionary(int capacity)
            : base(capacity)
        {
        }

        public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
            : base(capacity, comparer)
        {
        }

        protected SerializableDictionary(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }

        #endregion

        public XmlSchema GetSchema()
        {
            throw new NotImplementedException();
        }

        /**/
        /// <summary>
        /// 从对象的XML表示形式生成该对象
        /// </summary>
        /// <param name="reader"></param>
        public void ReadXml(XmlReader reader)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
            bool wasEmpty = reader.IsEmptyElement;
            reader.Read();

            if (wasEmpty)
                return;
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                reader.ReadStartElement("Key");
                TKey key = (TKey)keySerializer.Deserialize(reader);
                reader.ReadEndElement();

                reader.ReadStartElement("Value");
                TValue value = (TValue)valueSerializer.Deserialize(reader);
                reader.ReadEndElement();
                this.Add(key, value);
                reader.MoveToContent();
            }
            reader.ReadEndElement();
        }

        /// <summary>
        /// 将对象转换为其XML表示形式
        /// </summary>
        /// <param name="writer"></param>
        public void WriteXml(XmlWriter writer)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
            foreach (TKey key in this.Keys)
            {
                writer.WriteStartElement("Key");
                keySerializer.Serialize(writer, key);
                writer.WriteEndElement();

                writer.WriteStartElement("Value");
                TValue value = this[key];
                valueSerializer.Serialize(writer, value);
                writer.WriteEndElement();
            }
        }
    }

4.字符串

平时用的最多的肯定是字符串了,所以肯定也少了它:

  using System;
    using System.Collections.Generic;
    using System.Text;

    public static class StringHelper
    {
        /// <summary>
        /// 将字符串转换为base64编码数据
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string ToBase64String(this string str)
        {
            byte[] data = System.Text.ASCIIEncoding.ASCII.GetBytes(str);

            return Convert.ToBase64String(data);
        }

        /// <summary>
        /// 将base64编码数据转换为字符串
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string FromBase64String(this string str)
        {
            byte[] data = Convert.FromBase64String(str);

            return System.Text.ASCIIEncoding.ASCII.GetString(data);
        }
    }

5.汉转英

在系统检索菜品时,要根据拼音,所以这个也不能少,当然这个也有其他的方法,像存储过程或依靠数据库表都可以,下面是纯C#代码的:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    public class GetPinYinHelper
    {
        /// <summary>
        /// 获取拼音首字母
        /// </summary>
        /// <param name="strCharacter">要转换的中文汉字字符串</param>
        /// <returns>拼音缩写</returns>
        /// <author>xucj</author>
        /// <date>2011-10-15</date>
        public static string GetInitialPinYin(string strCharacter)
        {
            string tempStr = string.Empty;

            foreach (char c in strCharacter)
            {
                if ((int)c >= 33 && (int)c <= 126 || (int)c == 32)
                {
                    tempStr += c.ToString();            //字母和符号原样保留、同时空格也保留。
                }
                else
                {
                    tempStr += GetPYChar(c.ToString()); //累加拼音声母
                }
            }

            return tempStr;
        }

        /// <summary>
        /// 取单个字符的拼音声母
        /// </summary>
        /// <param name="character">要转换的单个汉字</param>
        /// <returns>拼音声母</returns>
        /// <author>xucj</author>
        /// <date>2011-10-15</date>
        private static string GetPYChar(string character)
        {
            byte[] array = new byte[2];

            array = System.Text.Encoding.Default.GetBytes(character);

            int i = (short)(array[0] - ‘\0‘) * 256 + ((short)(array[1] - ‘\0‘));

            if (i < 0xB0A1) return "*";

            if (i < 0xB0C5) return "a";

            if (i < 0xB2C1) return "b";

            if (i < 0xB4EE) return "c";

            if (i < 0xB6EA) return "d";

            if (i < 0xB7A2) return "e";

            if (i < 0xB8C1) return "f";

            if (i < 0xB9FE) return "g";

            if (i < 0xBBF7) return "h";

            if (i < 0xBFA6) return "j";

            if (i < 0xC0AC) return "k";

            if (i < 0xC2E8) return "l";

            if (i < 0xC4C3) return "m";

            if (i < 0xC5B6) return "n";

            if (i < 0xC5BE) return "o";

            if (i < 0xC6DA) return "p";

            if (i < 0xC8BB) return "q";

            if (i < 0xC8F6) return "r";

            if (i < 0xCBFA) return "s";

            if (i < 0xCDDA) return "t";

            if (i < 0xCEF4) return "w";

            if (i < 0xD1B9) return "x";

            if (i < 0xD4D1) return "y";

            if (i < 0xD7FA) return "z";

            return "*";
        }
    }

再加一个获取本机的IP与机器名与MAC地址的方法:

  using System.Management;
    using System.Net;

    public class NetHelper
    {
        /// <summary>
        /// 取得本机IP
        /// </summary>
        public static string GetIP()
        {
            string hostName = Dns.GetHostName();
            IPHostEntry ipEntry = Dns.GetHostEntry(hostName);
            IPAddress[] addr = ipEntry.AddressList;
            foreach (var item in addr)
            {
                if (item.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
                {
                    continue;
                }

                return item.ToString();
            }
            return null;
        }

        /// <summary>
        /// 获取本机MAC地址
        /// </summary>
        /// <returns></returns>
        public static string GetLocalMACAddress()
        {
            string mac = string.Empty;
            ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection queryCollection = query.Get();

            foreach (ManagementObject mo in queryCollection)
            {
                if (mo["IPEnabled"].ToString() == "True")
                    mac = mo["MacAddress"].ToString();
            }

            return mac;
        }

        /// <summary>
        /// 获取本机名
        /// </summary>
        /// <returns></returns>
        public static string GetHostName()
        {
            string hostName = Dns.GetHostName();

            return hostName;
        }

    }

当然还有很多,等后面需要再慢慢加上来,不相关的就不要了,那样肯定会太杂的,虽然有一些很好很优雅的公共代码,但是如果系统用不上,那也浪费了,那就让它保存在备用库里吧。这些代码来源还是广泛的,所以没有太多好写的,下次写数据库访问模块了。主要实现ORM这个功能,因为通用数据库访问模块网络上也是很多的,时间上应该不会占用太多时间,但是用ORM的话还是能够减少写SQL语句的时间,所以写一个带ORM功能的数据库访问模块。能不用写SQL的地方就靠它了。

当然还有其他代码,就不贴这里了,有需要的就mark下,没人mark的话就...........

时间: 2024-12-27 07:49:44

step by step 之餐饮管理系统五(Util模块)的相关文章

step by step 之餐饮管理系统七(点菜模块实现)

好长时间没有更新这个系列了,一是因为这段时间比较忙,有很多事情,二来要学习新的东西,AngularJs,devExpress这两上框架,都是比较有名的框架,先上图: 上面就是用来点菜的界面,左边是已点的菜,右边就是菜单,可以根据大类,拼音首字母与菜单编码三种方式来点,点的菜可以改数量等一些操作,主要业务就是这些 下面主要讲下技术方面的实现,每个菜单的方格就一个自定义的控件,上面显示的就是根据窗口大小去定义一定数量的这个控件,然后再把数据动态绑定到这个控件上并显示,这个显示主要根据不同的数据来决定

step by step 之餐饮管理系统二

昨天写了餐饮管理系统的相关需求,得到了园友的一些好的建议,感到很高兴,确实写的也不全面,现在补充一下需要的业务,这次主要做的主要是前台收银系统,所以业务主要集中在前台点菜收银这块,而后面数据管理这块则暂时先不考虑. 至于像权限,不同的组门应该有不同的权限不同级别的员工也有相应的权限,比如收银员只有9折的打折权限,而收银主管则可以打折到8.5折,而经理可以打折到8折.至于一个园友说的前景,希望系统可以应用在中小型的餐饮,都说民以食为天,特别是现在社会发展如此快,人民对生活水平的需求越来越高,她们不

step byt step之餐饮管理系统一

之前写过2015年的工作计划,其中有一项就是写一套管理系统,一来可以练练手,二来可以加强自己的学习,三来可以多园友多交流,共同进步.所以从今天开始把写系统的过程记录下来.先需求分析开始. 第一部分 引言 一.编写目的 1.此分析说明书整理餐饮收银系统中的需求,为后面的系统设计作准备,也就是描述了项目设计的要求. 二.背景 1.名称:餐饮管理系统,英文缩写名:RMS(restaurant manager system). 2.任务提出者:LZ 开发者:LZ, 本系统将实现客人进入餐饮邢台,点菜,传

数据库设计 Step by Step (1)——扬帆启航

引言:一直在从事数据库开发和设计工作,也看了一些书籍,算是略有心得.很久之前就想针 对关系数据库设计进行整理.总结,但因为种种原因迟迟没有动手,主要还是惰性使然.今天也算是痛下决心开始这项卓绝又令我兴奋的工作.这将是一个系列的文 章,我将以讲座式的口吻展开讨论(个人偷懒,这里的总结直接拿去公司培训新人用). 系列的第一讲我们先来回答下面几个问题 数据库是大楼的根基 大多数程序员都很急切,在了解基本需求之后希望很快的进入到编码阶段(可能只有产出代码才能反映工作量),对于数据库设计思考得比较少. 这

数据库设计 Step by Step (2)——数据库生命周期

引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整,需要花很多时间整理.思考数据库设计的各种资料,所以文章的更新速度可能会慢一些,也希望大家能够谅解. 系列的第二讲我们将站在高处俯瞰一下数据库的生命周期,了解数据库设计的整体流程 数据库生命周期 大家对软件生命周期较为熟悉,数据库也有其生命周期,如下图所示. 图(1)数据库生命周期 数据库的生命周期

WinForm RDLC SubReport Step by step

最近在做的一个PO管理系统,因为要用到订单打印,没有用水晶报表,直接使用VS2010的Reporting.参考了网上的一些文章,但因为找到的数据是用于WebForm的,适配到WinForm有点区别,竟然花了很久才搞通.所以现在做个Step By Step以记录. 参考Jimmy.Yang的博文: http://www.cnblogs.com/yjmyzz/archive/2011/09/19/2180940.html 开发环境:      VS2010 C# 第一步,新建项目 2.在项目中新建数

Step By Step(Lua目录)

Step By Step(Lua开篇)http://www.cnblogs.com/stephen-liu74/archive/2012/03/17/2403210.html一.简介二.主要优势三.应用场景 Step By Step(Lua基础知识)http://www.cnblogs.com/stephen-liu74/archive/2012/03/20/2407507.html一.基础知识二.类型与值 Step By Step(Lua表达式和语句)http://www.cnblogs.co

精通initramfs构建step by step

http://hi.baidu.com/jonathan2004/blog/item/db7bf38aad11759ea4c2721d.html 精通initramfs构建step by step (1)--hello world 2009-12-08 19:19 一.initramfs是什么 在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系统, 然后内核检查rootfs中是否包含有init文件,如果有则

数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)

什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSGS算法中是要求a^m在%c条件下的逆元的,如果a.c不互质根本就没有逆元.) 如果x有解,那么0<=x<C,为什么? 我们可以回忆一下欧拉定理: 对于c是素数的情况,φ(c)=c-1 那么既然我们知道a^0=1,a^φ(c)=1(在%c的条件下).那么0~φ(c)必定是一个循环节(不一定是最小的)