项目工作中常见问题系列! 持续更新!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目工作中常见问题系列! 持续更新!相关的知识,希望对你有一定的参考价值。

  •  欧洲日期转标准或中文日期

       欧洲大多数国家日期格式 24-12-1991  代表 dd-mm-yyyy 现在我想转换成中文日期格式1991年12月24日

       或者转成国际标准格式日期 1991-12-24  yyyy-mm-dd格式 怎么解决呢?

       这里我们可以通过正则表达式 轻松解决这个问题

        static void Main(string[] args)
        {
            //定义一组欧洲日期列表 数据来源可能是一张数据表 或txt文本文件等..
            var enDateList = new List<string>
            {
                "01-01-2016", "20-02-2017",
                "10-03-2014", "28-02-2015",
                "11-06-2013", "01-05-2015",
                "12-10-2010", "24-01-2011"
            };

            var cnDateList = new List<string>();
            enDateList.ForEach(d =>
            {
                //通过正则表达式进行转换
                var cnDate = System.Text.RegularExpressions.Regex.Replace(d, @"(\\d{2})-(\\d{2})-(\\d{4})", "$3年-$2月-$1日");
                cnDateList.Add(cnDate);//转换的日期重新填充一个新的 日期列表
            });

            cnDateList.ForEach(Console.WriteLine);//打印转换后的结果
            Console.ReadKey();
        }

 

         技术分享

      通过这个例子我们可以举一反三 转换成 标准日期格式 yyyy-mm-dd 或者转换美国的日期格式 mm-dd-yyyy

      这个解决方法非常简单, 如果你了解正则的情况下,可以看到其实就是通过正则 先分组然后替换分组实现的,

      题外话:小弟在工作中感觉学会正则,会帮自己轻松愉快的解决很多问题, 所以如果你还不会正则表达式 那么你应该

      开始学习!


 

  •  获取用户请求所在Ip地址和用户的城市信息

 这个需求问题在Web项目中基本都是必备功能!所以这里贴出源码,并解释下代码中的思想

  /// <summary>
        /// 获取客户端IP
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        public static string GetIp(RequestContext req)
        {
            try
            {
                //先用用 Request.ServerVariables ("HTTP_X_FORWARDED_FOR") 取IP 如果无法读取会返回Null
                string result = req.HttpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

                if (string.IsNullOrEmpty(result))
                {
                    //再用正常来取得客户端的IP地址   
                    result = req.HttpContext.Request.ServerVariables["REMOTE_ADDR"];
                }
                if (string.IsNullOrEmpty(result))
                {
                    //如果未读取再用其它方式读取尝试
                    result = req.HttpContext.Request.UserHostAddress;
                }
                if (string.IsNullOrEmpty(result))
                {
                    //没有读取返回默认地址
                    result = "0.0.0.0";
                }
                return result;
            }
            catch
            {
                return "0.0.0.0";
            }
           
        }

 

上面读取Ip地址代码的巧妙在于Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,

那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址。要想透过代理服务器取得客户端的真实IP地址,就要使用 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 来读取。

如果客户端没有通过代理服务器来访问,那么用 Request.ServerVariables ("HTTP_X_FORWARDED_FOR") 取到的值将是空的,所以我把它放在第一句执行,这样可以保证尽可能读取客户端的Ip地址

       接下来我们就可以通过Ip去获取用户所在城市的信息了(代码如下)

 /// <summary>
        /// 获取城市Ip
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        public static string GetIpCity(string ip)
        {
            try
            {
                //通过淘宝API方式获取用户地址信息
                string taoBaoApi = $"{"http://ip.taobao.com/service/getIpInfo.php?ip="}{ip}";

                System.Net.WebRequest httpReq = System.Net.WebRequest.Create(taoBaoApi);
                httpReq.Timeout = 2000; //设置请求超时2秒
                System.Net.WebResponse httpResp = httpReq.GetResponse();
                System.IO.Stream respStream = httpResp.GetResponseStream();
                using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream))
                {
                    string jsonText = reader.ReadToEnd();
                    JObject addr = (JObject)JsonConvert.DeserializeObject(jsonText);
                    if (addr["code"].ToString() != "0")//如果状态Code不等0 就代表请求失败
                    {
                        return "未知地址";
                    }
                    else
                    {
                        //获取结果
                        string address = $"{addr["data"]["region"]}{addr["data"]["city"]}";
                        return address;
                    }
                }
            }
            catch
            {
                return "未知地址";
            }
        }       

 

 

  •  如果让方法返回多个结果?

 在工作编写代码中可能会遇到写一个方法 我想返回多个结果集的问题,这种解决办法 有几种,小弟在这里列出我最常用的2种.

方式1:通过out参数 进行多个结果参数返回, out参数在我们入门第二 三章就可能学过! 它的目的是可以把值类型当引用类型来传递!

这里我们可以借助它的特点来进行多个结果集返回!

例子1: 假如我们要写个分页的方法 GetPageData(),分页它不仅要获取分页查询后的结果集 还要获取分页这张表的总项数

基于这个需求我们可以只写一个方法 就能同时获取2个结果 

         /// <summary>
        /// 数据表 分页
        /// </summary>
        /// <param name="pageNum">指定页数</param>
        /// <param name="pageSize">指定每页多少项</param>
        ///<param name="outTotal">输出当前表的总项数</param>
        /// <returns>分页后的结果集数据</returns>
        public IEnumerable<TEntity> GetPageData(int pageNum, int pageSize, out long outTotal)

 

 

调用方式

 

 long tableCount;//拿到表的总项数
 var data= _repExample.GetPageData(1, 20, out tableCount);//拿到分页后的数据集

 

 

 

 

方式2: 可以同过定义一个类来接受多个结果集,比如基于上面的GetPage分页的方法 我可以单独定义一个 PageResult的类 来返回我的数据 (以下为伪代码 演示用)

 

Public Class PageResult
{
     /// <summary>
        ///  获取或设置数据查询总记录数
        /// </summary>
        public long total { get; set; }

        /// <summary>
        /// 获取查询总页数
        /// </summary>
        public long TotalPage
        {
            get
            {
                if (total % PageSize != 0)
                {
                    return total / PageSize + 1;
                }
                else
                {
                    return total / PageSize;
                }
            }
        }

        /// <summary>
        /// 获取或设置查询数据
        /// </summary>
        public IEnumerable<TEntity> rows { get; set; }
   
}

 

 

 

 

这样我们可以用我们定义的这个类来接受返回的多个参数

 

未完(持续更新 自我总结) 

 

 

以上是关于项目工作中常见问题系列! 持续更新!的主要内容,如果未能解决你的问题,请参考以下文章

小程序各种功能代码片段整理---持续更新

持续集成与持续部署宝典Part 1:将构建环境容器化

一点就分享系列(实践篇5-上篇)[持续更新中!代码已吸收!依旧全网首发] yolov7解析:yolov5的plus扩充 ,仍旧值得学习!一起看V5代码如何变成V7!

图谱(学习地图)系列总结,持续更新中

图谱(学习地图)系列总结,持续更新中

导致活动不工作的片段中的按钮(更新)