网站虽小,五脏俱全(干货)

前言

最近一个朋友让帮忙做一个汇率换算的网站,用业余时间,到最后总算是实现了其需要的功能,其中也用到了一些相关的技术,把它写出来,给大家做一个参考,也给自己一个总结!

需求

1.按指定需求根据最新汇率进行汇率的换算,这就需要得到最新的汇率值

2.实现QQ弹出对话功能

3.后台返回换算后的money,汇率,服务费等数据

4.实现页面无刷新

具体实现一:前台代码实现

前台就是界面的布局,一些HTML代码,前台不是很熟,大家就不用挑剔了,看看界面实现就行了。主要的一个实现就是QQ弹出对话功能,QQ号码换成自己的了。各位有需要的看官可以直接copy此功能

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>澳元人民币汇率计算</title>
    <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    <script src="Scripts/cc.js" type="text/javascript"></script>
<style type="text/css">
#img{ background-image: url(Image/bg2.jpg);
width:710px;
height:250px;
margin-left:40px;}
 .top      { display:block;
             margin-top:5px;
             margin-bottom:5px;
             line-height:30px;}
 .wenzi{ font-size:12px;}
 .shuomingli{border-bottom: #930 2px solid;
             display:block;
             margin-top:5px;
             margin-bottom:5px;
             line-height:30px;}
 a{ color: #03F;
 text-decoration:none;}
 a:hover{ color:#F00;}
</style>
</head>

<body>

  <div style="margin:30px auto; padding:0px; width:750px;">
     <div id="img">
     </div>
<form id="form1" runat="server">
      <ul style="list-style:none;">
        <li style="background: #900; height:25px;"><span style="color:#FFF; font-size:14px;line-height:25px;">&nbsp;&nbsp;<b>汇率计算:</b></span>
        </li>
        <li class="top"><span style="font-size:14px;">需要<span style="color:#C00;"><strong>兑换</strong></span>的<span style="color: #C00;"><strong>人民币</strong></span>:</span><input id="txtAmount" type="text" /><span style="font-size:14px;">&nbsp;汇率为:&nbsp;<input id="rate"  style="width:90px;" type="text" readonly="readonly"/></span><span style="font-size:14px;">&nbsp;服务费为:&nbsp;<input id="serverCharge"  style="width:100px;" type="text" readonly="readonly"/></span><a href="tencent://message/?Menu=yes&uin=331341164&Service=200&sigT=dcfc1fdf4a83b1602a334a540048009f26d65d6f377f8dc66c97d8ecc64228e8b8441583f92b707a"><span><img  style=" border:0px; vertical-align: middle; padding-bottom:5px; padding-left:2px;" src="Image/button_11.gif"></span></a>
        </li>
        <li class="top"><span style="font-size:14px;">需要<span style="color:#C00;"><strong>支付</strong></span>的<span style="color:#C00;"><strong>澳&nbsp;&nbsp;元</stong></span>:</span><input id="txtPay" type="text" readonly="readonly"/><input id="submit" style=" background-color: #CCC" type="button" value="计算" />
        <li class="top"><span style="font-size:12px;">最新汇率查询:<a href="http://www.boc.cn/sourcedb/whpj/" target="_Blank">&nbsp;&nbsp;中国银行实时汇率</a></span>
        </li>
       </ul>
</form>
        <ul style="list-style:none;">
         <li style="background: #900; height:25px;"><span style="line-height:25px; font-size:14px; color:#FFF;"><b>&nbsp;&nbsp;兑换说明:</b></span>
        </li>
        <li class="shuomingli"><span class="wenzi">1.以上兑换所用基础汇率均为最新汇率,可以查询相关网站以验证。</span>
        </li>
        <li class="shuomingli"><span class="wenzi">2.所使用汇率由兑换人民币钱数多少决定。兑换钱数越多汇率越接近实时汇率。
       </span>
        </li>
        <li class="shuomingli"><span class="wenzi">3.经以上步骤所得的价格最后再加5%的服务费即为最所需要您支付的澳元总额,若多次交易者手续费可商议而定。</span>
        </li>
        <li class="shuomingli"><span class="wenzi">4.如有问题请联系QQ:331341164</span>
        </li>

      </ul>
  </div>

</body>
</html>

具体实现二:最新汇率的获取

最好的实现当然是通过付费的webservices来获取最新的实时汇率,但是咱这只是一个简单的实现,我是通过抓取《中国银行外汇牌价》来得到汇率值,其中用到了一个HTML解析组件:HtmlAgilityPack,大家可以去了解一下,具体实现参考了网上的一些demo,代码如下:

       /// <summary> 获取远程HTML内容</summary>
        /// <param name="url">远程网页地址URL</param>
        /// <returns>成功返回远程HTML的代码内容</returns>
        private string GetWebContent(string strUrl)
        {
            string str = "";
            try
            {
                WebClient wc = new WebClient();
                wc.Credentials = CredentialCache.DefaultCredentials;
                Encoding enc = Encoding.GetEncoding("UTF-8");// 如果是乱码就改成 UTF-8 / GB2312
                Stream res = wc.OpenRead(strUrl);//以流的形式打开URL
                StreamReader sr = new StreamReader(res, enc);//以指定的编码方式读取数据流
                str = sr.ReadToEnd();//输出(HTML代码)
                res.Close();

                wc.Dispose();
            }
            catch (Exception ex)
            {
                return "";
            }
            return str;
        }

        private DataTable GetRateTable(string strHtml)
        {

            DataTable dt = new DataTable();
            DataColumn col1 = new DataColumn("Currency Name", typeof(string));
            DataColumn col2 = new DataColumn("Buying Rate", typeof(string));
            DataColumn col3 = new DataColumn("Cash Buying Rate", typeof(string));
            DataColumn col4 = new DataColumn("Selling Rate", typeof(string));
            DataColumn col5 = new DataColumn("Cash Selling Rate", typeof(string));
            DataColumn col6 = new DataColumn("Middle Rate", typeof(string));
            DataColumn col7 = new DataColumn("Pub Time", typeof(string));

            dt.Columns.Add(col1);
            dt.Columns.Add(col2);
            dt.Columns.Add(col3);
            dt.Columns.Add(col4);
            dt.Columns.Add(col5);
            dt.Columns.Add(col6);
            dt.Columns.Add(col7);

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(strHtml);

            doc.OptionOutputAsXml = true;
            HtmlAgilityPack.HtmlNode node = doc.DocumentNode.SelectSingleNode(".//table[tr/th=\"Currency Name\"]");
            if (node == null)
            {
                return null;
            }
            HtmlAgilityPack.HtmlNodeCollection trNodeList = node.SelectNodes("tr[td]");

            foreach (HtmlAgilityPack.HtmlNode trNode in trNodeList)
            {
                DataRow dr = dt.NewRow();
                for (int j = 0; j < 7; j++)
                {
                    HtmlAgilityPack.HtmlNodeCollection tdNodeList = trNode.SelectNodes("td");
                    dr[j] = tdNodeList[j].InnerText.Replace("&nbsp;", " "); ;
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }

        /// <summary>
        /// 根据国家的代码编号,得到汇率值
        /// </summary>
        /// <param name="No">国家代码</param>
        /// <returns></returns>
        private decimal GetRateByCountryNo(string No)
        {
            decimal rate = 0M;
            try
            {
                string html = GetWebContent("http://www.boc.cn/sourcedb/whpj/enindex.html").Trim();
                DataTable dt = GetRateTable(html);
                if (dt == null)
                    rate = 0M;
                else
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (dt.Rows[i]["Currency Name"].ToString() == No)
                        {
                            rate = Convert.ToDecimal(dt.Rows[i]["Cash Buying Rate"].ToString()) / 100;
                        }
                    }
                }
            }
            catch (Exception)
            {
                rate = 0M;
            }
            return rate;
        }

具体实现三:后台数据到前台展示

因为是返回多个数据,返回的josn格式的数据,其中用到了序列化组件:Newtonsoft.Json.Net20,将需要返回的数据全部装在一个数据实体类里面,然后进行序列化,返回到前台,再进行解析,后台代码如下:

    public class Handler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            WebClient web = new WebClient();
            //string url = string.Format("http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={0}{1}=X", "AUD", "CNY");
            //string response = web.DownloadString(url);
            //string[] values = Regex.Split(response, ",");
            decimal rate = GetRateByCountryNo("AUD");
            decimal amount = 0M;
            //decimal result = 0M;
            string returnStr = "";
            if (rate == 0M)
                returnStr = ToJson("通信出错,请稍后再试........");
            else
            {
                try
                {
                    ReturnModel model = new ReturnModel();
                    amount = System.Convert.ToDecimal(context.Request["amount"]);
                    //decimal rate = 5.82M;//System.Convert.ToDecimal(values[1]);
                    if (amount > 0 && amount <= 1000)
                    {
                        model.Rate = Math.Round(rate - 0.6M, 2);
                        model.Result = Math.Round(amount / model.Rate, 2);
                        model.ServerCharge = Math.Round(model.Result * 0.05M, 2);
                    }
                    else if (amount > 1000 && amount <= 5000)
                    {
                        model.Rate = Math.Round(rate - 0.4M, 2);
                        model.Result = Math.Round(amount / model.Rate, 2);
                        model.ServerCharge = Math.Round(model.Result * 0.05M, 2);
                    }
                    else if (amount > 5000)
                    {
                        model.Rate = Math.Round(rate - 0.3M, 2);
                        model.Result = Math.Round(amount / model.Rate, 2);
                        model.ServerCharge = Math.Round(model.Result * 0.05M, 2);
                    }
                    returnStr = ToJson(model);
                }
                catch (Exception)
                {
                    returnStr = ToJson("输入金额错误");
                }
            }
            context.Response.Write(returnStr);
        }
        /// <summary>
        /// 将object对象进行序列化
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public static string ToJson(object t)
        {
            return JsonConvert.SerializeObject(t, Formatting.Indented,
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include });
        }
}

具体实现四:ajax实现及前台数据解析

无刷新实现通过jquery 封装的ajax来实现,直接上代码:

$(document).ready(function () {
    $(‘#submit‘).click(function () {
        var errormsg = "";
        var amount = $(‘#txtAmount‘).val();
        $.ajax({ type: "POST",
            url: "Handler.ashx",
            data: { amount: amount },
            contentType: "application/x-www-form-urlencoded",
            dataType: "json",
            beforeSend: function () {
                $(‘#txtPay‘).val("正在转换...");
            },
            success: function (data) {
                $(‘#txtPay‘).val(data.Result);
                $(‘#rate‘).val(data.Rate);
                $(‘#serverCharge‘).val(data.ServerCharge);
            },
            error: function (jqXHR, exception) {
                if (jqXHR.status === 0) {
                    errormsg = ‘Not connect.\n Verify Network.‘; ;
                } else if (jqXHR.status == 404) {
                    errormsg = ‘Requested page not found. [404]‘; ;
                } else if (jqXHR.status == 500) {
                    errormsg = ‘Internal Server Error [500].‘; ;
                } else if (exception === ‘parsererror‘) {
                    errormsg = ‘Requested JSON parse failed.‘; ;
                } else if (exception === ‘timeout‘) {
                    errormsg = ‘Time out error.‘; ;
                } else if (exception === ‘abort‘) {
                    errormsg = ‘Ajax request aborted.‘; ;
                } else {
                    errormsg = ‘Uncaught Error.‘;
                }
                alert(errormsg);
            }
        });
    });
});

总结

至此,一个小小的功能网站就算是完成了,主要关键步骤就是汇率的获取这里,也涉及其他的技术点,就说这么多吧,觉得好的给个赞!

源码下载:猛戳这里!

网站虽小,五脏俱全(干货)

时间: 2024-10-09 13:08:54

网站虽小,五脏俱全(干货)的相关文章

GIS专业书籍、文档、数据、网站、工具等干货

整理.分享一些个人整理的GIS专业书籍.文档.数据.网站.工具等.也希望大家将自己的心得也分享出来,一起交流,共同进步. 一.原理应用类 GIS基础类 01.地理信息系统--原理.方法和应用(邬伦)??Doc下载? ?PDF下载 02.地理信息系统概论(黄杏元)??PDF下载 03.地理信息系统导论(陈述彭)?PDF下载 04.第一部分 地图投影及其坐标转换公式? ?PDF下载 05.第二部分 非地图投影坐标运算公式? ?PDF下载 06.GIS空间分析原理与方法(刘湘楠)??PDF下载 07.

JSP+Ajax网站开发小知识

一.JSP基础 1.<select  name="love"  size="3">其中的size属性指定了列表框显示选项的条数,如果所有选项多于这个数,将会出现滚动条. 2.addCookie(Cookie  cookie)方法将其放入客户端,获取Cookie对象可调用request对象的Cookie[]  getcookies()方法. Cookie   myCookie  =  new  Cookie("name",  "

Windows 7环境下网站性能测试小工具 Apache Bench 和 Webbench使用和下载

1.简要说明: Apache Bench 是Apache的网站性能测试小程序,Windows平台下的程序名简称ab.exe,要想获得这个80k的可执行程序,用户需要下载整个Apache Httpd软件包!还需要将其安装到电脑上,确实比较麻烦. Webbench也是一款网站性能测试小程序,可以获得网站的吞吐率.传送速度等基本性能指标.该程序是在Linux下编程的,在Linux下编译安装使用都很方便,但在Windows 下的程序却没有. 为了方便起见,我将ab.exe 小程序单独拷贝出来,并且下载了

[转]网站地址栏小图标favicon.ico的制作方法

有人也许会好奇,有的网址前面有个漂亮的小图标而且有的网站图标还会动,这是怎么做到的呢? 如下图所示: 那个小图标有个名字叫favicon.ico,网站图标虽小但可以起到很好的点缀作用,尤其是当浏览者将你的网站放入收藏夹之后,网站图标的作用就出来了,它可以使你的站点在众多网址中突出显示,对于用户体验起到很好的作用,好了,废话不多说,现在来告诉大家怎么做favicon.ico这个网站图标文件. 虽然现在有很多在线制作网站图标的网站,但制作出来的图标实在是差强人意,而且不支持透明样式的ico,这非常糟

ASP.NET网站维护小技巧-&gt;使用CodeFile模式

网站正式上线之后,在对网站进行功能修改的时候,经常去重新将代码编译成dll文件,重新上传到服务.如果网站需要经常对一些非常细小琐碎的功能进行修改,每次都重新打开VS,重新编译代码,未免显得太过麻烦,ASP.NET提供了一种编程模式,CodeFile,很好的解决了这类问题,我简单的做了一个DEMO给大家演示,大家也可以做更多尝试. ·首先创建一个解决方案. ·将其部署到电脑上任意位置. 打开IIS,添加站点. 在根本录下新建两个txt文件,添加以上代码. 将它们重命名为MyDemo.aspx和My

剑走偏锋,robots.txt快速抓取网站的小窍门

在我抓取网站遇到瓶颈,想剑走偏锋去解决时,常常会先去看下该网站的robots.txt文件,有时会给你打开另一扇抓取之门. 写爬虫有很多苦恼的事情,比如: 1.访问频次太高被限制: 2.如何大量发现该网站的URL: 3.如何抓取一个网站新产生的URL,等等: 这些问题都困扰着爬虫选手,如果有大量离散IP和账号,这些都不是问题,但是绝大部分公司都不具备这个条件的. 我们在工作中写的爬虫大多是一次性和临时性的任务,需要你快速完成工作就好,当遇到上面情况,试着看下robots.txt文件. 举个栗子:

HTML网站建设小技巧

从企业的角度分析: 1.建站为了什么? 企业要先明白自己为什么要建网站,不能只是效仿别人,看到别人得到赢利与好处,就也想要上前分一杯羹.其实你并不明白这些好处是怎么来的,也不明白这些好处到底可以为企业带来什么?其实想要了解这些并不难,那就是在建站之前,定位企业到底需要一个什么样的网站,是服务型网站还是销售型网站,不同类型的网站搭建起来的要求功能当然也不同. 2.我们的用户在哪? 网络营销不是一项简单的工作,需要考虑到很多因素.我们*主要的目的是让用户能够在网站中消费.首先要明白自己的产品所针对的

第三章web安全基础—互联网注册网站相关小知识

前面的碎碎念 像新浪.哔哩哔哩这种大的网站,类似于一个新闻站点.门户,都是比较大的知名企业,做网站以及对网站进行优化甚至都有几百人. 小一点的比如我们的学校也有对外发布的网站,还有其他大大小小的企业都会有自己的门户网站,这一级别的自己去开发网站就不太现实,所以网上就有许多可以快速生成网站的模板(开源的),各企业有自己再需要有的功能再自己进行这一块的开发,所以一旦有一个模板的漏洞被挖出来,就会有许多基于此模板进行开发的网站受影响,开源的好处是代码都是开放的,许多人在用也都能看到代码,这样漏洞一般也

六个简单而有创意的网站设计小技巧

创意并不是说有就有的,而且也不是随手就可以得到的,尤其是哪些每天都需要创意的设计师来说,灵感的昙花一现是不够的,也不能支撑工作的使用.但是在设计行业的设计师们都会有自己的一些特别的技巧,那么在网站制作过程中,想要获得创意有哪些设计方法呢?下面就一起来分享一下有哪些创意的方式. 第一.将创意直接展示出来.这是创意设计最常见的一种手法,具体的做法就是可以将产品或者想要表达的主题直接地真实地展示在广告位上,同时使用摄影或者绘画的技巧来加强写实的表现能力.细致地描写产品的质感,将产品的形态以及功能全面地