新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → 用GDI+来画报表图,并用在WEB上 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 36472 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 用GDI+来画报表图,并用在WEB上 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     cwzb 帅哥哟,离线,有人找我吗?双鱼座1981-3-10
      
      
      威望:4
      头衔:没有耳多
      等级:(版主)
      文章:253
      积分:1753
      门派:XML.ORG.CN
      注册:2004/1/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cwzb发送一个短消息 把cwzb加入好友 查看cwzb的个人资料 搜索cwzb在『 Dot NET,C#,ASP,VB 』的所有贴子 访问cwzb的主页 引用回复这个贴子 回复这个贴子 查看cwzb的博客楼主
    发贴心情 用GDI+来画报表图,并用在WEB上


    此主题相关图片如下:
    按此在新窗口浏览图片


    此主题相关图片如下:
    按此在新窗口浏览图片


    此主题相关图片如下:
    按此在新窗口浏览图片
    //可能大家会觉得这张图片难看。呵呵。因为数据不大合理,所以画出来的线也是乱七八糟的。

    //关于这个画图的东西,有一个问题:字不能斜。这个我在下面也做了审明。不过我会尽快把它处理掉。

    [此贴子已经被作者于2004-6-14 13:28:01编辑过]

       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    无能不多智不要紧。
    关键是肯学,感兴趣!

    送给我自己的话!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/6/14 13:03:00
     
     cwzb 帅哥哟,离线,有人找我吗?双鱼座1981-3-10
      
      
      威望:4
      头衔:没有耳多
      等级:(版主)
      文章:253
      积分:1753
      门派:XML.ORG.CN
      注册:2004/1/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cwzb发送一个短消息 把cwzb加入好友 查看cwzb的个人资料 搜索cwzb在『 Dot NET,C#,ASP,VB 』的所有贴子 访问cwzb的主页 引用回复这个贴子 回复这个贴子 查看cwzb的博客2
    发贴心情 
    以上是做好后的次果图片;
    我先把代码先放上去,日后,再进行一些说明。如果朋友们觉得没有必要,那,讲解部门,我就不讲了。
    在放代码前,我先介绍代码里一个重要的问题:
    1。在第一张图片,跟第三张图片,还不能把字往下斜。不过,我会把它改过来的:)
    现在放代码。

    我先建了一个库项目,共有五个文件:
    1,AnalyseBase.cs
    2,DataSource.cs
    3,Hismap.cs
    4,Linmap.cs
    5,Primap.cs
    我为这个类库项目取名为:Report;namespace:Biisomsoft.Report.
    以下把各文件的源代码贴上去:
    1,AnalyseBase.cs
    using System;
    using System.Drawing;
    using System.Drawing.Text;
    using System.Drawing.Imaging;
    using System.Drawing.Drawing2D;

    namespace Biisomsoft.Report
    {
    public class AnalyseBase
    {
      private DataSource _dataSource;
      public DataSource dataSource
      {
       get
       {
        return _dataSource;
       }
       set
       {
        _dataSource=value;
       }
      }
      private Pen[] _map_pens;//画笔
      protected Pen[] map_pens
      {
       get
       {
        return _map_pens;
       }
      }
      private Font _font;
      protected Font font
      {
       get
       {
        return this._font;
       }
      }

      private Bitmap _map_canvas;//画布
      protected Bitmap map_canvas
      {
       get
       {
        return _map_canvas;
       }    
      }


      
      //////////////////////////////////////////////////
      

      protected AnalyseBase(){}

      protected void DataBind()
      {
       this._map_canvas=new Bitmap(this._dataSource.map_width,this._dataSource.map_hieght);
       this._map_pens  =new Pen[]{Pens.Blue,
                Pens.Red,
                Pens.Green,
                Pens.Orange,
                Pens.Black,
                Pens.Purple,
                Pens.SlateGray,
                Pens.Olive,
                Pens.DarkSlateBlue,
                Pens.Violet,
                Pens.CadetBlue,
                Pens.Goldenrod,
                Pens.DarkGreen,
                Pens.Brown,
                Pens.HotPink,
                Pens.BlueViolet,
               };
       this._font      =new Font("宋体",9);
      }
      public virtual Bitmap CreateMap()
      {
       return null;
      }
    }
    }

    2,DataSource.cs

    using System;

    namespace Biisomsoft.Report
    {
    /// <summary>
    /// DataSource 的摘要说明。
    /// </summary>
    public class DataSource
    {
      #region  -- 画布大小 --
      private int _map_width;
      public int map_width
      {
       get
       {
        return _map_width;
       }
       set
       {
        _map_width=value;
       }
      }
      private int _map_hieght;
      public int map_hieght
      {
       get
       {
        return _map_hieght;
       }
       set
       {
           _map_hieght=value;
       }
      }
      #endregion 画布大小

      #region 定义折线图的数据源
      private string[] _lin_titles;
      public string[] lin_titles
      {
       get
       {
        return _lin_titles;
       }
       set
       {
        _lin_titles=value;
       }
      }
      private string[] _lin_texts;
      public string[] lin_texts
      {
       get
       {
        return _lin_texts;
       }
       set
       {
        _lin_texts=value;
       }
      }
      private float[,] _lin_values;
      public float[,] lin_values
      {
       get
       {
        return _lin_values;
       }
       set
       {
        _lin_values=value;
       }
      }

      #endregion 定义折线图的数据源

      #region 饼图与柱图的数据源
      private string[] _texts;
      public string[] pri_texts
      {
       get
       {
        return _texts;
       }
       set
       {
        _texts=value;
       }
      }
      public string[] his_texts
      {
       get
       {
        return _texts;
       }
       set
       {
        _texts=value;
       }
      }

      private float[] _values;
      public float[] pri_values
      {
       get
       {
        return _values;
       }
       set
       {
        _values=value;
       }
      }
      public float[] his_values
      {
       get
       {
        return _values;
       }
       set
       {
        _values=value;
       }
      }
      #endregion 饼图与柱图的数据源

      public DataSource()
      {
       this._map_width =650;
       this._map_hieght=400;
      }
    }
    }


    3,Hismap.cs

    using System;
    using System.Drawing;
    using System.Drawing.Text;
    using System.Drawing.Imaging;
    using System.Drawing.Drawing2D;

    namespace Biisomsoft.Report
    {
    /// <summary>
    /// Hismap 的摘要说明。
    /// </summary>
    public class Hismap:AnalyseBase
    {  

      public override Bitmap CreateMap()
      {
       base.DataBind();

       string[] texts=base.dataSource.his_texts;   
       float[] valus =base.dataSource.his_values;
       Pen[]  pens   =base.map_pens;

       Graphics g=Graphics.FromImage(base.map_canvas);
      
       //给出数据源

       int area_width =570;//
       int area_hieght=300;
       
       int defalt_span=80; //作为数据源的可控部份

       if(area_width>texts.Length*defalt_span)
        area_width=texts.Length*defalt_span;
      
       Rectangle area=new Rectangle(50,50,area_width,area_hieght);

       g.Clear(Color.Snow);
       g.SmoothingMode=SmoothingMode.AntiAlias;
       g.DrawRectangle(Pens.Black,area);
       g.FillRectangle(new LinearGradientBrush(area,Color.Snow,Color.LightSteelBlue,LinearGradientMode.BackwardDiagonal),
        area.X,
        area.Y-1,
        area.Width+2,
        area.Height+1);
       //画出区域

       int y_count=5;
       int y_width=20;
       int y_span   =area.Height/y_count;
       long y_top  =(this.Work_Top(valus)/10)*11;
       int his_side;//柱的底面边长

       if(valus.Length>16)
       {
        g.DrawString("我感到非常抱歉,因为我只能帮你显示16支以内的柱子。建议更改分析段!谢谢。",base.font,Brushes.Red,area.Left+20,area.Height/2);
        return base.map_canvas;
       }//如果要画的柱子多于16,装先行退出程序

       if(texts.Length<10)
        his_side=30;
       else
       {
        his_side=((area_width-20)/texts.Length)/2-1;
       }

       Pen line_pen=Pens.Blue;
       for(int i=0;i<y_count;i++)
       {
        g.DrawLine(Pens.Black,area.Left-y_width,area.Y+y_span*i,area.Left           ,area.Y+y_span*i);
        
        g.DrawLine(line_pen,area.Left           ,area.Y+y_span*(i+1)           ,area.Left+his_side/2,area.Y+y_span*(i+1)-his_side/2);
        g.DrawLine(line_pen,area.Left+area.Width,area.Y+y_span*(i+1)-his_side/2,area.Left+his_side/2,area.Y+y_span*(i+1)-his_side/2);

        g.DrawString(Convert.ToString(y_top-y_top/y_count*i),base.font,Brushes.Black,area.Left-y_width*2,area.Y+y_span*i,StringFormat.GenericTypographic);
       }
       g.DrawLine(line_pen,area.Left+his_side/2,area.Bottom-his_side/2,area.Left+his_side/2,area.Top);
       //画出Y轴

       int x_count =texts.Length;  
       int x_span  =area.Width/x_count;
       
       int   his_span  =his_side*2/3;
       float his_hieght=0;
       RectangleF   temp_r;
       GraphicsPath temp_p;
       for(int i=0;i<x_count;i++)
       {
        if(valus[i]<1)
         his_hieght=1;
        else
         his_hieght=valus[i];

        temp_r=new RectangleF(area.Left+his_span+(his_side*3/2+his_span)*i,area.Bottom-(area.Height*(his_hieght/y_top)),his_side,(area.Height*(his_hieght/y_top)));
        temp_p=new GraphicsPath(new PointF[]{
                    new PointF(temp_r.Left             ,temp_r.Top),
                    new PointF(temp_r.Left+his_side/2  ,temp_r.Top-his_side/2),
                    new PointF(temp_r.Left+his_side*3/2,temp_r.Top-his_side/2),
                    new PointF(temp_r.Left+his_side*3/2,temp_r.Bottom-his_side/2),
                    new PointF(temp_r.Left+his_side    ,temp_r.Bottom),
                    new PointF(temp_r.Left+his_side    ,temp_r.Top)
                   },
         new byte[]
                {
                 (byte)PathPointType.Start,
                 (byte)PathPointType.Line,
                 (byte)PathPointType.Line,
                 (byte)PathPointType.Line,
                 (byte)PathPointType.Line,
                 (byte)PathPointType.Line
                });

        g.FillRectangle(new LinearGradientBrush(temp_r,Color.Snow,pens[i].Color,LinearGradientMode.BackwardDiagonal),temp_r);
        g.FillPath(new SolidBrush(pens[i].Color),temp_p);
        g.DrawString(texts[i],base.font,Brushes.Black,temp_r.Left,area.Bottom+2,new StringFormat(StringFormatFlags.DirectionVertical));
        g.DrawString(valus[i].ToString(),base.font,Brushes.Black,temp_r.Left+his_side/2,temp_r.Top-his_side);
       }
       //画出柱子
                
       return base.map_canvas;
      }
      private int Work_Top(float[] valus)
      {
       int temp=0;
       for(int i=0;i<valus.GetLength(0);i++)
       {
        if(temp<valus[i])
         temp=(int)valus[i];
       }
       
       temp=(int.Parse(temp.ToString().Substring(0,1))+1)*(int)Math.Pow(10,temp.ToString().Length-1);
       if(temp<2)
        return 100;
       else
                    return (temp);
      }
    }
    }

    4,Linmap.cs

    using System;
    using System.Drawing;
    using System.Drawing.Text;
    using System.Drawing.Imaging;
    using System.Drawing.Drawing2D;

    namespace Biisomsoft.Report
    {
    /// <summary>
    /// Linmap 的摘要说明。
    /// </summary>
    public class Linmap:AnalyseBase
    {
      
      public override Bitmap CreateMap()
      {
       base.DataBind();

       string[] texts =base.dataSource.lin_texts;
       string[] titles=base.dataSource.lin_titles;
       float[,] valus =base.dataSource.lin_values;
       Pen[]  pens    =base.map_pens;

       Graphics g=Graphics.FromImage(base.map_canvas);
      
       //给出数据源

       int area_width =520;//
       int area_hieght=300;
       int defalt_span=80; //作为数据源的可控部份

       if(area_width>texts.Length*defalt_span)
        area_width=texts.Length*defalt_span;
      
       Rectangle area=new Rectangle(50,50,area_width,area_hieght);

       g.Clear(Color.Snow);
       g.SmoothingMode=SmoothingMode.AntiAlias;
       g.DrawRectangle(Pens.Black,area);
       g.FillRectangle(new LinearGradientBrush(area,Color.Snow,Color.LightSteelBlue,LinearGradientMode.BackwardDiagonal),
        area.X,
        area.Y-1,
        area.Width+1,
        area.Height+1);
       //画出区域
       
       int y_count=5;
       int y_width=20;

       if(valus.GetLength(1)>16)
       {
        g.DrawString("我感到非常抱歉,因为我只能帮你显示16个以内的段。建议更改分析段!谢谢。",base.font,Brushes.Red,area.Left+20,area.Height/2);
        return base.map_canvas;
       }//如果要画的段数多于16,装先行退出程序

       int y_span  =area.Height/y_count;
       long y_top  =(this.Work_Top(valus)/10)*11;

       for(int i=0;i<y_count;i++)
       {
        g.DrawLine(Pens.Black,area.Left-y_width,area.Y+y_span*i,area.Left           ,area.Y+y_span*i);
        g.DrawLine(new Pen(new HatchBrush(HatchStyle.DarkVertical,Color.White,Color.Green),1) ,area.Left       ,area.Y+y_span*i,area.Left+area.Width,area.Y+y_span*i);
        g.DrawString(Convert.ToString(y_top-y_top/y_count*i),base.font,Brushes.Black,area.Left-y_width*2,area.Y+y_span*i);
       }
       //画出Y轴

       int x_count =texts.Length;
       int x_hieght=20;
       int x_span  =area.Width/x_count;
       
       for(int i=0;i<x_count;i++)
       {
        g.DrawLine(Pens.Black,area.Left+x_span*i,area.Bottom,area.Left+x_span*i,area.Bottom+x_hieght);
        g.DrawString(texts[i],base.font,Brushes.Black,area.Left+x_span*i,area.Bottom+2);
       }
       //画出X轴

       for(int i=0;i<valus.GetLength(0);i++)
       {
        for(int j=0;j<x_count-1;j++)
        {
         g.DrawLine(pens[i],
          area.Left+x_span*j,
          area.Bottom-area.Height*(valus[i,j]/y_top),
          area.Left+x_span*(j+1),
          area.Bottom-area.Height*(valus[i,j+1]/y_top));
        }
       }
       //画出折线图

       int block_height=15;
       int block_width =50;
       int block_span  =8;
       Rectangle r=new Rectangle(  area.Right-(x_span*2/3),
        area.Top-block_height*2,
        block_span*2+block_width,
        (block_height+block_span)*valus.GetLength(0)+block_span);
       g.DrawRectangle(Pens.Black,r);
       g.FillRectangle(Brushes.Snow,r);
       for(int i=0;i<valus.GetLength(0);i++)
       {
        g.FillRectangle(new SolidBrush(pens[i].Color),
         r.Left+block_span,
         r.Top+block_span+(block_height+block_span)*i,
         block_width,block_height);
        g.DrawString(  titles[i],
         base.font,Brushes.Black,
         r.Right,
         r.Top+block_span+(block_height+block_span)*i);
       }
       //画出示意目录

       return map_canvas;

       //输出并结束
      }
      private int Work_Top(float[,] valus)
      {
       int temp=0;
       for(int i=0;i<valus.GetLength(0);i++)
       {
        for(int j=0;j<valus.GetLength(1);j++)
        {
         if(temp<valus[i,j])
          temp=(int)valus[i,j];
        }
       }
       
       temp=(int.Parse(temp.ToString().Substring(0,1))+1)*(int)Math.Pow(10,temp.ToString().Length-1);
       if(temp<2)
        return 100;
       else
        return (temp);
      }
            
    }
    }

    5,Primap.cs

    using System;
    using System.Drawing;
    using System.Drawing.Text;
    using System.Drawing.Imaging;
    using System.Drawing.Drawing2D;

    namespace Biisomsoft.Report
    {
    /// <summary>
    /// Primap 的摘要说明。
    /// </summary>
    public class Primap:AnalyseBase
    {
      
      public override Bitmap CreateMap()
      {
       base.DataBind();

       string[] texts =base.dataSource.pri_texts;
       float[] valus  =base.dataSource.pri_values;
       Pen[]  pens    =base.map_pens;

       Graphics g=Graphics.FromImage(base.map_canvas);

       int area_width =300;//  
       float value_sum=0;
       for(int i=0;i<valus.Length;i++)
       {
        value_sum+=valus[i];
       }
       
       Rectangle area=new Rectangle(80,50,area_width,area_width);
       int area_span=30;

       g.Clear(Color.Snow);
       g.SmoothingMode=SmoothingMode.AntiAlias;
       g.DrawRectangle(Pens.Black,area.Left-area_span,area.Top-area_span,area.Width+area_span*2,area.Height+area_span*2);

       float degree=10;
       double radian;
       float x1,x2,y1,y2;
       int svalue_width=40;
       for(int i=0;i<valus.Length;i++)
       {
        g.FillPie(new LinearGradientBrush(area,Color.White,pens[i].Color,LinearGradientMode.BackwardDiagonal),area,degree,360*(valus[i]/value_sum));
        radian=Math.PI*(180*valus[i]/value_sum+degree)/180;

        x1=(float)(area.Left+area_width/2+(area_width/2-50)*Math.Cos(radian));
        y1=(float)(area.Top +area_width/2+(area_width/2-50)*Math.Sin(radian));
        x2=(float)(area.Left+area_width/2+(area_width/2+15)*Math.Cos(radian));
        y2=(float)(area.Top +area_width/2+(area_width/2+15)*Math.Sin(radian));

        g.DrawLine(  pens[i],x1,y1,x2,y2);
        if(Math.Cos(radian)>0)
        {
         g.DrawLine( pens[i],x2,y2,x2+svalue_width,y2);
         g.DrawString(valus[i].ToString(),base.font,new SolidBrush(pens[i].Color),x2,y2+2);
        }
        else
        {
         g.DrawLine( pens[i],x2,y2,x2-svalue_width,y2);
         g.DrawString(valus[i].ToString(),base.font,new SolidBrush(pens[i].Color),x2-svalue_width,y2+2);
        }
        
         

        degree+=360*(valus[i]/value_sum);
       }
       
       //画出饼块

       int block_width =40;
       int block_hieght=20;
       int block_span  =10;
       Rectangle r=new Rectangle(  area.Right+area_span+block_span,
              area.Top-area_span,
              block_width+block_span*2,
              (block_hieght+block_span)*valus.Length+block_span);

       g.DrawRectangle(Pens.Black,r);
       g.FillRectangle(Brushes.Snow,r);
       for(int i=0;i<valus.Length;i++)
       {
        g.FillRectangle(  new LinearGradientBrush( new Rectangle(r.Left+block_span,r.Top+block_span+(block_hieght+block_span)*i,block_width,block_hieght),
         pens[i].Color,
         Color.Snow,
         LinearGradientMode.BackwardDiagonal),
         r.Left+block_span,
         r.Top+block_span+(block_hieght+block_span)*i,
         block_width,
         block_hieght);
        g.DrawString(Convert.ToString((valus[i]/value_sum*100))+"% "+texts[i],base.font,Brushes.Black,r.Right+2,r.Top+block_span+(block_hieght+block_span)*i);
       }
       //画出标志方块
       return base.map_canvas;
      }
    }
    }

    ///////////////////////以上为DLL文件里的内容;

    DLL的使用方法,例:
    Primap       primap=new Primap();
    DataSource source=new DataSource();
    source.pri_texts  =new string[]{"a","b"};
    source.pri_values=new float[](100,500);

    primap.datasource=source;
    primap.CreateMap().Sava(Respone.OutStream,ImageFormat.jpeg);//这是在WEB上的用法.

    ----------------------------------------------
    无能不多智不要紧。
    关键是肯学,感兴趣!

    送给我自己的话!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/6/14 13:08:00
     
     cwzb 帅哥哟,离线,有人找我吗?双鱼座1981-3-10
      
      
      威望:4
      头衔:没有耳多
      等级:(版主)
      文章:253
      积分:1753
      门派:XML.ORG.CN
      注册:2004/1/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cwzb发送一个短消息 把cwzb加入好友 查看cwzb的个人资料 搜索cwzb在『 Dot NET,C#,ASP,VB 』的所有贴子 访问cwzb的主页 引用回复这个贴子 回复这个贴子 查看cwzb的博客3
    发贴心情 
    刚才给出了DLL项目文件的代码。大家感兴趣的,完全可以修改一下,改得自己认为更好的。
    也可以直接来我这里要DLL文件。或是自己把代码COPY下来。编译一下。呵呵。
    下面我给出调用它的WEBSERVICES文件:
    1AnalyseServices.asmx

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Web;
    using System.Web.Services;

    using System.Drawing.Imaging;
    using System.Text;

    using OrdermanSystem.CommonLibrary.Data;
    using OrdermanSystem.BusinessLogic.SalesManage;
    using Biisomsoft.Report;

    namespace OrdermanSystem.WEBUI.SalesManage.SalesAnalyse
    {

     public enum EMapType
     {
      linmap,
      hismap,
      primap,
     }

     public class AnalyseServices : System.Web.Services.WebService
     {  
      private clsSalesManage     _SalesManage=new clsSalesManage();
      private EMapType           _MapType;
      private ESalesAnalyseType  _AnalyseType;
      private DataSet            _DataSet;
      private DataSource         _DataSource;

      private Linmap             _linmap;
      private Hismap             _hismap;
      private Primap             _primap;

      public AnalyseServices()
      {
       //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
       InitializeComponent();
      }

      #region 组件设计器生成的代码
      
      //Web 服务设计器所必需的
      private IContainer components = null;
        
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {
      }

      /// <summary>
      /// 清理所有正在使用的资源。
      /// </summary>
      protected override void Dispose( bool disposing )
      {
       if(disposing && components != null)
       {
        components.Dispose();
       }
       base.Dispose(disposing);  
      }
      
      #endregion

      #region -- 图片创建函数 --
      
      [WebMethod]
      public void LinMap(short itype,int itemid,DateTime fromday,DateTime today,int dayspan)
      {
       this._MapType=EMapType.linmap;

       _linmap=new Linmap();
       _linmap.dataSource=this.GetDataSource(itype,dayspan,fromday,today,itemid);
       
       _linmap.CreateMap().Save(HttpContext.Current.Response.OutputStream,ImageFormat.Jpeg);
      }

         [WebMethod]
      public void PriMap(short itype,int itemid,DateTime fromday,DateTime today,int dayspan)
      {   
       this._MapType=EMapType.primap;
           
       _primap=new Primap();
       _primap.dataSource=this.GetDataSource(itype,dayspan,fromday,today,itemid);

       _primap.CreateMap().Save(HttpContext.Current.Response.OutputStream,ImageFormat.Jpeg);
      }

      [WebMethod]
      public void HisMap(short itype,int itemid,DateTime fromday,DateTime today,int dayspan)
      {   
       this._MapType=EMapType.hismap;
           
       _hismap=new Hismap();
       _hismap.dataSource=this.GetDataSource(itype,dayspan,fromday,today,itemid);
       
       _hismap.CreateMap().Save(HttpContext.Current.Response.OutputStream,ImageFormat.Jpeg);
      }

      //////////////////////////////////1.按查找数据获得数据源
      #endregion

      private DataSource GetDataSource(short itype,int dayspan,DateTime fromday,DateTime today,int itemid)
      {
       _AnalyseType=(ESalesAnalyseType)itype;
       _DataSet    =new DataSet();

       switch(_AnalyseType)
       {
           case ESalesAnalyseType.ItemConsumes:
         _SalesManage.CosumeTimeAnalyse(itemid,dayspan,fromday,today,ref _DataSet);
         break;
         
        case ESalesAnalyseType.ItemSusiness:
         _SalesManage.CosumeMoneyAnalyse(itemid,dayspan,fromday,today,ref _DataSet);
         break;

        case ESalesAnalyseType.PhaseSusiness:
         _SalesManage.AllCosumeMoneyAnalyse(dayspan,fromday,today,ref _DataSet);
         break;

        case ESalesAnalyseType.RepastCount:
         _SalesManage.AllCosumePersonAnalyse(dayspan,fromday,today,ref _DataSet);
         break;

        case ESalesAnalyseType.RepastSusiness:
         break;
       }

       return this.BuilderSource(_DataSet.Tables[0],dayspan,fromday,today,itemid);
      }

      private DataSource BuilderSource(DataTable table,int dayspan,DateTime fromday,DateTime today,int itemid)
      {
       _DataSource=new DataSource();

       string[] texts,titles;
       float[]  values;
       float[,] lin_values;

       switch(_MapType)
       {
        case EMapType.hismap:
         this.BuilderData_His(table,"","",out texts,out values);
         _DataSource.his_texts =texts;
         _DataSource.his_values=values;
         break;

        case EMapType.linmap:
         this.BuliderData_Lin(table,"","",out texts,out lin_values,out titles);
         _DataSource.lin_texts =texts;
         _DataSource.lin_titles=titles;
         _DataSource.lin_values=lin_values;
         break;

        case EMapType.primap:
         this.BuilderData_Pri(table,"","",out texts,out values);
         _DataSource.pri_texts=texts;
         _DataSource.pri_values=values;
         break;
       }
       
       return _DataSource;

      }  
      
      //  
      //        日,周,月,季,年
      //         1,  2 , 3,  4, 5

      ///////////////////////////////////////////////////////////2.结束
      ///////////////////////////////////////////3.按分析图类型获得数据源
      
      private void BuilderData_His(DataTable table,string textfield,string valuefield,out string[] texts,out float[] values)
      {
       texts =new string[table.Rows.Count];
       values=new float[table.Rows.Count];

       for(int i=0;i<table.Rows.Count;i++)
       {
        texts[i] =table.Rows[i][0].ToString();
        values[i]=Convert.ToSingle(table.Rows[i][1]);    
       }
      }
      private void BuilderData_Pri(DataTable table,string textfield,string valuefield,out string[] texts,out float[] values)
      {
       texts =new string[]{"午餐情况","晚餐情况","夜宵情况","早餐情况"};
       values=new float[texts.Length];
          
       int col_count=table.Columns.Count;

       DataColumn col1=new DataColumn("col1",Type.GetType("System.Decimal"),"Sum("+table.Columns[2].ColumnName+")");
       DataColumn col2=new DataColumn("col2",Type.GetType("System.Decimal"),"Sum("+table.Columns[3].ColumnName+")");
       DataColumn col3=new DataColumn("col3",Type.GetType("System.Decimal"),"Sum("+table.Columns[4].ColumnName+")");
       DataColumn col4=new DataColumn("col4",Type.GetType("System.Decimal"),"Sum("+table.Columns[5].ColumnName+")");

       table.Columns.Add(col1);
       table.Columns.Add(col2);
       table.Columns.Add(col3);
       table.Columns.Add(col4);

       for(int i=0;i<texts.Length;i++)
       {
        values[i]=Convert.ToSingle(table.Rows[0][col_count+i]);
       }  

      }
      private void BuliderData_Lin(DataTable table,string textfield,string valuefield,out string[] texts,out float[,] values,out string[] titles)
      {
       texts =new string[table.Rows.Count];
       values=new float[5,table.Rows.Count];
       titles=new string[]{"总额情况","午餐情况","晚餐情况","夜宵情况","早餐情况"};

       for(int i=0;i<table.Rows.Count;i++)
       {
        texts[i]=table.Rows[i][0].ToString();
        values[4,i]=Convert.ToSingle(table.Rows[i][1]);
        values[0,i]=Convert.ToSingle(table.Rows[i][2]);
        values[1,i]=Convert.ToSingle(table.Rows[i][3]);
        values[2,i]=Convert.ToSingle(table.Rows[i][4]);
        values[3,i]=Convert.ToSingle(table.Rows[i][5]);
       }
      }
            
     }
    }

    //有关ADO。NET的数据源方面。我就不给出了。这个文件作一下参考,大家可以把数据源方面改一下。一般也就可以用。
    这个文件里,我用了一个ENUM。

    ----------------------------------------------
    无能不多智不要紧。
    关键是肯学,感兴趣!

    送给我自己的话!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/6/14 13:19:00
     
     cwzb 帅哥哟,离线,有人找我吗?双鱼座1981-3-10
      
      
      威望:4
      头衔:没有耳多
      等级:(版主)
      文章:253
      积分:1753
      门派:XML.ORG.CN
      注册:2004/1/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cwzb发送一个短消息 把cwzb加入好友 查看cwzb的个人资料 搜索cwzb在『 Dot NET,C#,ASP,VB 』的所有贴子 访问cwzb的主页 引用回复这个贴子 回复这个贴子 查看cwzb的博客4
    发贴心情 
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    现在给出ASP。NET页面。主要有JS来参数传给WEBSERVICES,所以这个将是无刷新的一个系统:
    1.WebForm1.aspx
    2.WebForm1.aspx.cs//主要作为:初始化一些数据

    1.WebForm1.aspx
    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="OrdermanSystem.WEBUI.SalesManage.SalesAnalyse.business.WebForm1" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
     <HEAD>
      <title>阶段营业分析</title>
      <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
      <meta name="CODE_LANGUAGE" Content="C#">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
      <link rel="stylesheet" href="../../../_style/main.css" type="text/css">
      <script language="javascript">
      <!--
      function Calendar_Select(e) {
       if (document.getElementById("myCal").style.visibility=="hidden") {
        document.getElementById("myCal").style.visibility="visible";
        //月历根据文本框中的位置定位
        document.getElementById("myCal").style.top=e.previousSibling.offsetTop+20;
        document.getElementById("myCal").style.left=e.previousSibling.offsetLeft-120;
        document.getElementById("myCal").className=e.previousSibling.id;
       }
       else {
        document.getElementById("myCal").style.visibility="hidden";
       }
      }
      -->
      </script>
      <script language="javascript" type="text/javascript">
      function bms_PhaseSelect(obj)
      {
      
          //a.selectedIndex;//0,1,2,3,4
          if(obj.selectedIndex<2)
          {
              document.getElementById("phase1").style.display  ="inline";
        document.getElementById("phase2").style.display  ="none";
              return;
          }
          //对周或日进行计算
          
          if(obj.selectedIndex<4)
          {
              document.getElementById("phase1").style.display  ="none";
        document.getElementById("phase2").style.display  ="inline";
        document.getElementById("phase3_1").style.display="inline";
        document.getElementById("phase3_2").style.display="inline";
              return;
          }
          //对月跟季进行计算
          
          document.getElementById("phase1").style.display  ="none";
          document.getElementById("phase2").style.display  ="inline";
          document.getElementById("phase3_1").style.display="none";
          document.getElementById("phase3_2").style.display="none";
          return;
          //对年进行计算
      }
      </script>
      <script language="javascript" type="text/javascript">
      function bms_chick(e)
      {
          var fromtime;
          var totime;
          var item_id='1';
          if(item_id=="")
          {
              alert("提示:请先选择左边项目!");
              return;
          }
          var dayspan=document.getElementById("ddlPhase").item(document.getElementById("ddlPhase").selectedIndex).value;
          switch(dayspan)
          {
              case "1":
              case "2":
                  fromtime=document.getElementById("tbFormtime").getAttribute("value");
                  totime  =document.getElementById("tbToTime").getAttribute("value");
                  
                  if(fromtime.split('-')[0]!=totime.split('-')[0])
                  {
                      alert("提示:以“日”或“周”为段的分析,不能跨年!!");
                      return;
                  }
                  if(dayspan==1&&Math.abs(Number(fromtime.split('-')[1])-Number(totime.split('-')[1]))>1)
                  {
                      alert("提示:以“日”为段的分析,不能跨月,并只能在16天以内!");
                      return;
                  }
                  if(dayspan==2&&Math.abs(Number(fromtime.split('-')[1])-Number(totime.split('-')[1]))>3)
                  {
                      alert("提示:以“周”为段的分析,不能跨月,并只能在16周以内!");
                      return;
                  }
                  
                  break;  
              case "3":
              case "4":              
              case "5":
                  fromtime =document.getElementById("ddlfromYear").item(document.getElementById("ddlfromYear").selectedIndex).value+"-";
                  fromtime+=document.getElementById("ddlfromMonth").item(document.getElementById("ddlfromMonth").selectedIndex).value+"-1";
                  totime   =document.getElementById("ddltoYear").item(document.getElementById("ddltoYear").selectedIndex).value+"-";
                  totime  +=document.getElementById("ddltoMonth").item(document.getElementById("ddltoMonth").selectedIndex).value+"-1";
                  
                  if(dayspan==3&&Math.abs(Number(fromtime.split('-')[0])-Number(totime.split('-')[0]))>2)
                  {
                      alert("提示:以“月”为段的分析,不能跨月,并只能在16月以内!");
                      return;
                  }
                  if(dayspan==3&&Math.abs(Number(fromtime.split('-')[0])-Number(totime.split('-')[0]))>4)
                  {
                      alert("提示:以“季”为段的分析,不能跨月,并只能在4年以内!");
                      return;
                  }
                  
                  break;
          }//确定好时间
          
          switch(e)
          {
              case "0":
                  document.getElementById("maphome").src="../AnalyseServices.asmx/LinMap?itype=3&itemid="+item_id+"&fromday="+fromtime+"&today="+totime+"&dayspan="+dayspan+"&maptype=1";
                  break;
             
              case "1":              
                  document.getElementById("maphome").src="../AnalyseServices.asmx/HisMap?itype=3&itemid="+item_id+"&fromday="+fromtime+"&today="+totime+"&dayspan="+dayspan+"&maptype=1";
                  break;
              
              case "2":
                  document.getElementById("maphome").src="../AnalyseServices.asmx/PriMap?itype=3&itemid="+item_id+"&fromday="+fromtime+"&today="+totime+"&dayspan="+dayspan+"&maptype=1";
                  break;
          }      
      }
      </script>
      <style type="text/css">.bmc_show { DISPLAY: inline }
     .bmc_hidde { DISPLAY: none }
      </style>
     </HEAD>
     <body MS_POSITIONING="FlowLayout" bottomMargin="0" leftMargin="0" topMargin="0" rightMargin="0">
      <form id="Form1" method="post" runat="server">
       <table height="83" cellSpacing="0" cellPadding="0" width="100%" background="../../../_images/toolback_a.png"
        border="0">
        <tr height="53">
         <td>分析项目:<asp:textbox id="tbName" runat="server" CssClass="textred" Width="100" ReadOnly="True">阶段营业客分析</asp:textbox>&nbsp;&nbsp;&nbsp;&nbsp;
          分析日期:以<asp:dropdownlist id="ddlPhase" runat="server" onchange="bms_PhaseSelect(this);">
           <asp:ListItem Value="1">日</asp:ListItem>
           <asp:ListItem Value="2" Selected="True">周</asp:ListItem>
           <asp:ListItem Value="3">月</asp:ListItem>
           <asp:ListItem Value="4">季</asp:ListItem>
           <asp:ListItem Value="5">年</asp:ListItem>
          </asp:dropdownlist>为段 &nbsp;<span class="bmc_show" id="phase1">从<asp:textbox id="tbFormtime" runat="server" CssClass="textred" Width="80" ReadOnly="True"></asp:textbox><input onclick="javascript:return Calendar_Select(this)" type="button" value="v">
           到<asp:textbox id="tbToTime" runat="server" CssClass="textred" Width="80" ReadOnly="True"></asp:textbox><input onclick="javascript:return Calendar_Select(this)" type="button" value="v">
          </span><span class="bmc_hidde" id="phase2">从
           <asp:dropdownlist id="ddlfromYear" Runat="server"></asp:dropdownlist>年 <span id="phase3_1">
            <asp:dropdownlist id="ddlfromMonth" Runat="server">
             <asp:ListItem Value="1">1</asp:ListItem>
             <asp:ListItem Value="2">2</asp:ListItem>
             <asp:ListItem Value="3">3</asp:ListItem>
             <asp:ListItem Value="4">4</asp:ListItem>
             <asp:ListItem Value="5">5</asp:ListItem>
             <asp:ListItem Value="6">6</asp:ListItem>
             <asp:ListItem Value="7">7</asp:ListItem>
             <asp:ListItem Value="8">8</asp:ListItem>
             <asp:ListItem Value="9">9</asp:ListItem>
             <asp:ListItem Value="10">10</asp:ListItem>
             <asp:ListItem Value="11">11</asp:ListItem>
             <asp:ListItem Value="12">12</asp:ListItem>
            </asp:dropdownlist>月 </span>到
           <asp:dropdownlist id="ddltoYear" Runat="server"></asp:dropdownlist>年 <span id="phase3_2">
            <asp:dropdownlist id="ddltoMonth" Runat="server">
             <asp:ListItem Value="1">1</asp:ListItem>
             <asp:ListItem Value="2">2</asp:ListItem>
             <asp:ListItem Value="3">3</asp:ListItem>
             <asp:ListItem Value="4">4</asp:ListItem>
             <asp:ListItem Value="5">5</asp:ListItem>
             <asp:ListItem Value="6">6</asp:ListItem>
             <asp:ListItem Value="7">7</asp:ListItem>
             <asp:ListItem Value="8">8</asp:ListItem>
             <asp:ListItem Value="9">9</asp:ListItem>
             <asp:ListItem Value="10">10</asp:ListItem>
             <asp:ListItem Value="11">11</asp:ListItem>
             <asp:ListItem Value="12">12</asp:ListItem>
            </asp:dropdownlist>月 </span></span>
         </td>
        </tr>
        <tr height="30">
         <td align="right"><INPUT type="button" value="阶段情况总览" onclick="bms_chick('1');"><INPUT type="button" value="餐次情况比例图" onclick="bms_chick('2');"><INPUT type="button" value="餐次情况走势图" onclick="bms_chick('0');">
         </td>
        </tr>
       </table>
       <iframe id="myCal" style="BORDER-RIGHT: 0px solid; BORDER-TOP: 0px solid; Z-INDEX: 100; LEFT: 0px; VISIBILITY: hidden; BORDER-LEFT: 0px solid; WIDTH: 220px; BORDER-BOTTOM: 0px solid; POSITION: absolute; TOP: 200px; HEIGHT: 145px"
        src="../../../_script/HtmCom/CALENDAR.htm" frameborder="no" scrolling="no"></iframe>
       <IFRAME id="maphome" frameBorder="no" width="100%" scrolling="no" height="450"></IFRAME>
      </form>
     </body>
    </HTML>


    2.WebForm1.aspx.cs

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;

    using OrdermanSystem.BusinessLogic.SalesManage;

    namespace OrdermanSystem.WEBUI.SalesManage.SalesAnalyse.business
    {
     /// <summary>
     /// WebForm2 的摘要说明。
     /// </summary>
     public class WebForm2 : System.Web.UI.Page
     {  
      protected System.Web.UI.WebControls.TextBox tbName;
      protected System.Web.UI.WebControls.TextBox tbFormtime;
      protected System.Web.UI.WebControls.TextBox tbToTime;
      protected System.Web.UI.WebControls.DropDownList ddlPhase;

      //
      protected clsSalesManage _SalesManage=new clsSalesManage();
      protected System.Web.UI.WebControls.DropDownList ddlfromYear;
      protected System.Web.UI.WebControls.DropDownList ddlfromMonth;
      protected System.Web.UI.WebControls.DropDownList ddltoYear;
      protected System.Web.UI.WebControls.DropDownList ddltoMonth;
      protected DataSet       _DataSet;
     
      private void Page_Load(object sender, System.EventArgs e)
      {
       if(!IsPostBack)
       {
        this.LoadThisPage();   
       }
      }

      #region Web 窗体设计器生成的代码
      override protected void OnInit(EventArgs e)
      {
       //
       // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
       //
       InitializeComponent();
       base.OnInit(e);
      }
      
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {    
       this.Load += new System.EventHandler(this.Page_Load);

      }
      #endregion

      private void LoadThisPage()
      {
       this.BuilderDLLYEAR();
       this.tbFormtime.Text=DateTime.Now.Date.AddMonths(-1).ToString().TrimEnd("0:00:00".ToCharArray());
       this.tbToTime.Text  =DateTime.Now.Date.ToString().TrimEnd("0:00:00".ToCharArray());
       this.ddltoYear.SelectedValue =DateTime.Now.Year.ToString();
       this.ddltoMonth.SelectedValue=DateTime.Now.Month.ToString();  
      }
      
      private void BuilderDLLYEAR()
      {
       for(int i=2000;i<2050;i++)
       {
        ddlfromYear.Items.Add(new ListItem(i.ToString(),i.ToString()));
        ddltoYear.Items.Add(new ListItem(i.ToString(),i.ToString()));
       }
      }    
     }
    }

    //到这里也就完成了。

    ----------------------------------------------
    无能不多智不要紧。
    关键是肯学,感兴趣!

    送给我自己的话!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/6/14 13:23:00
     
     hsb0307 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:89
      门派:XML.ORG.CN
      注册:2004/6/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hsb0307发送一个短消息 把hsb0307加入好友 查看hsb0307的个人资料 搜索hsb0307在『 Dot NET,C#,ASP,VB 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hsb0307的博客5
    发贴心情 
    能不能直接给整个项目的源文件,我们学习起来方便一点。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/6/15 9:15:00
     
     cwzb 帅哥哟,离线,有人找我吗?双鱼座1981-3-10
      
      
      威望:4
      头衔:没有耳多
      等级:(版主)
      文章:253
      积分:1753
      门派:XML.ORG.CN
      注册:2004/1/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cwzb发送一个短消息 把cwzb加入好友 查看cwzb的个人资料 搜索cwzb在『 Dot NET,C#,ASP,VB 』的所有贴子 访问cwzb的主页 引用回复这个贴子 回复这个贴子 查看cwzb的博客6
    发贴心情 
    当然可以:)
    可是有地方放吗?这里可不可以直接上传?
    //请把建议写在回复里.

    顺便转告一下大家,关于字不能斜的问题,我已经解决了.....呵呵...可以说它现在已经进入实用阶段.


    ///////////////////////////////////////////////////////
    上次所讲的字不能倾斜的问题,我已经纠正。。可看下面的图片:


    此主题相关图片如下:
    按此在新窗口浏览图片

    下面我入上项目文件,以供大家下学试玩。。。由于工作较忙,一直都没有优化过。大家可以好好的优化一下。


    [此贴子已经被作者于2004-6-17 14:40:41编辑过]

    ----------------------------------------------
    无能不多智不要紧。
    关键是肯学,感兴趣!

    送给我自己的话!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/6/16 22:52:00
     
     rain-yy 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2005/4/27

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给rain-yy发送一个短消息 把rain-yy加入好友 查看rain-yy的个人资料 搜索rain-yy在『 Dot NET,C#,ASP,VB 』的所有贴子 引用回复这个贴子 回复这个贴子 查看rain-yy的博客7
    发贴心情 
    谢谢楼主,我做毕设正好要用到这个。不过我是刚开始学,有什么不会的还要问。:)
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/27 11:05:00
     
     锋锋 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2005/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给锋锋发送一个短消息 把锋锋加入好友 查看锋锋的个人资料 搜索锋锋在『 Dot NET,C#,ASP,VB 』的所有贴子 引用回复这个贴子 回复这个贴子 查看锋锋的博客8
    发贴心情 
    so good!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/5/15 23:32:00
     
     z_shunquan 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:65
      门派:XML.ORG.CN
      注册:2005/5/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给z_shunquan发送一个短消息 把z_shunquan加入好友 查看z_shunquan的个人资料 搜索z_shunquan在『 Dot NET,C#,ASP,VB 』的所有贴子 引用回复这个贴子 回复这个贴子 查看z_shunquan的博客9
    发贴心情 
    好好看看下。谢谢
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/5/28 10:05:00
     
     billy_king1982 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2005/10/20

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给billy_king1982发送一个短消息 把billy_king1982加入好友 查看billy_king1982的个人资料 搜索billy_king1982在『 Dot NET,C#,ASP,VB 』的所有贴子 引用回复这个贴子 回复这个贴子 查看billy_king1982的博客10
    发贴心情 
    看来不错啊!!
    看看先!!
    谢楼主啊!!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/20 20:54:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/30 22:45:16

    本主题贴数12,分页: [1] [2]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    265.625ms