您好!欢迎访问家园网-www.jy.wang!

家园网

PHP使用JpGraph生成3D饼形图详细教程

网络 作者:本站 点击:

PHP使用JpGraph生成3D饼形图详细教程

下面我将逐步讲解如何使用JpGraph库在PHP中生成3D饼形图,并对每个步骤进行详细解析。

<?php
// 第一步:引入JpgGraph类库及其扩展模块
require_once 'src/jpgraph.php';                 // 引入JpgGraph核心类库
require_once 'src/jpgraph_pie.php';           // 引入饼形图功能模块
require_once 'src/jpgraph_pie3d.php';          // 引入3D饼形图功能模块
// 第二步:准备数据
$data = array(690, 780, 990, 630, 980);        // 设置统计数据,表示各部分的大小
// 第三步:创建画布对象
$graph = new PieGraph(600, 300);               // 创建饼图对象,参数为宽度和高度
// 第四步:设置图表标题
$graph->title->SetFont(FF_CHINESE);            // 设置中文字体
$graph->title->Set('商场各类商品销售额比例');  // 设置图表标题
// 第五步:创建3D饼图对象
$pieplot = new PiePlot3D($data);               // 创建3D饼图对象,传入数据数组
// 第六步:设置饼图位置
$pieplot->SetCenter(0.5, 0.5);                 // 设置饼图居中,参数为x和y坐标(0-1)
// 第七步:准备图例数据
$department = array('IT数码', '家电', '日用', '服装', '食品'); // 设置各部分名称
// 第八步:设置图例
$pieplot->SetLegends($department);             // 为饼图设置图例
// 第九步:设置图例样式
$graph->legend->SetFont(FF_CHINESE);           // 设置图例字体
$graph->legend->SetLayout(LEGEND_HOR);         // 设置图例布局方式(水平)
$graph->legend->Pos(0.5, 0.98, 'center', 'bottom'); // 设置图例位置
// 第十步:将饼图添加到画布
$graph->Add($pieplot);                         // 将3D饼图添加到统计图对象中
// 第十一步:输出图像
$graph->Stroke();                              // 渲染并输出图表
?>

1. 引入类库

require_once 'src/jpgraph.php';                 // 引入JpgGraph核心类库
require_once 'src/jpgraph_pie.php';           // 引入饼形图功能模块
require_once 'src/jpgraph_pie3d.php';          // 引入3D饼形图功能模块

这段PHP代码是使用JpGraph图表库生成3D饼图的基础引入部分,其核心作用是通过分层加载机制逐步构建图表绘制环境。从三个层面进行解析:

  1. 模块化架构设计

  • require_once:确保类库只被加载一次

  • jpgraph.php JpgGraph的核心类库,是基础引擎,提供画布创建、坐标系统、字体渲染等底层支持

  • jpgraph_pie.php 饼形图专用功能模块,在基础层上实现二维饼图的数学计算和绘制算法

  • jpgraph_pie3d.php 3D饼形图专用功能模块,通过继承机制扩展出三维效果,添加了:

    • 柱状厚度渲染

    • 光照阴影计算

    • 透视变形处理

  1. 文件引入顺序的奥秘
    必须严格按照从基础到扩展的顺序加载:

基础引擎 → 2D功能 → 3D扩展

这种依赖关系如同建造房屋:

  • 地基(核心库)

  • 主体结构(饼图模块)

  • 装修装饰(3D效果)

  1. **实际开发注意事项

  • 路径问题:建议使用绝对路径如/var/www/include/jpgraph/src/

  • 加载验证:应添加文件存在性检查

if (!file_exists('src/jpgraph.php')) {
    throw new Exception('核心库文件缺失');
}
  • 性能优化:生产环境建议使用自动加载机制替代require_once

这种模块化设计体现了软件工程的"单一职责原则",每个文件只专注做好一件事,通过组合实现复杂功能。在后续开发中,这三个文件的组合将为创建具有以下特性的图表奠定基础:

  • 支持中文标签渲染

  • 可调节的3D视角和厚度

  • 自定义颜色方案

  • 交互式图例系统

理解这种分层结构对于后续调试尤为重要,例如当出现3D效果异常时,可以快速定位是基础绘图问题还是3D扩展模块的问题。

2. 准备数据

$data = array(690, 780, 990, 630, 980);        // 设置统计数据,表示各部分的大小


这段代码是使用PHP创建数组数据结构的关键部分,下面进行解析:

  1. (1)‌数据结构本质

  • 这是一个包含5个数值的数组,表示饼图中5个部分的大小。数值越大,对应的饼图部分越大

  • 每个数值代表饼图扇区的面积比例,单位可以是:

    • 实际数值(如元、个)

    • 百分比(需归一化处理)

  1. (2)‌数据规范要求

  2. 数据类型要求

  • 必须为整型或浮点型数值,不可使用字符串格式(如'690'会导致计算错误)

  • 推荐使用显式类型转换:(int)$value 或 floatval($value)

  1. 数值有效性规则

  • 仅接受非负数(包含0),负值会被自动校正为0

  • 单个数值建议范围:0 ≤ value ≤ 10,000(过大数值需做归一化处理)

  • 所有数据项总和应大于0(全0数组无法生成有效图表)

  1. 数据结构规范

  • 最少需要2个数据点(单数据无法构成饼图)

  • 最大建议不超过12个数据点(过多会导致可视化混乱)

  • 空值必须显式处理为0或过滤移除

  1. 工程实践建议

  • 数据预处理流程:

    • 类型强制转换

    • 空值过滤

    • 负值校正

    • 极值处理(超过平均值3倍的数据建议特殊标注)

  • 动态数据建议添加容错机制:

if (array_sum($data) == 0) {
    $data = [1, 1]; // 默认fallback数据
}
  1. 可视化优化

  • 当存在微小值(<总和的1%)时:

    • 建议合并为"其他"分类

    • 或启用放大显示模式

  • 数据差异过大时建议:

    • 使用对数刻度

    • 添加数值标签辅助阅读

这些规范是保证JpGraph生成有效3D饼图的基础条件,实际开发中还需配合颜色映射、图例生成等后续处理步骤。

  1. ‌(3)工程实践建议

  • 数据验证应添加:

if (!is_array($data) || count($data) < 2) {
    throw new InvalidArgumentException('无效的饼图数据');
}
  • 大数据量处理技巧:

// 当数据超过8项时自动合并小项
if (count($data) > 8) {
    $data = array_merge(array_slice($data, 0, 5), ['其他' => array_sum(array_slice($data, 5))]);
}


3. 创建画布对象

$graph = new PieGraph(600, 300);               // 创建饼图对象,参数为宽度和高度

这段PHP代码是使用JpGraph图表库创建饼图的核心初始化语句,下面进行解析:

  1. 核心功能
    $graph = new PieGraph(600, 300) 是使用JpGraph库初始化饼图对象的典型写法,其中:

  2. 600 设定画布宽度(像素)

  3. 300 设定画布高度(像素)

  4. 技术实现

  5. 底层通过PHP的GD库创建图像资源

  6. 自动计算坐标系和绘图区域(会扣除标题、图例等占用的空间)

  7. 默认启用抗锯齿渲染(通过imageantialias()实现)

  8. 设计考量

  9.        宽高比2:1是数据可视化的黄金比例:

      1. 左侧60%区域用于绘制饼图主体

      2. 右侧40%区域放置图例说明

        600x300的尺寸适配:

      3. PC端显示(最小兼容1024px屏幕)

      4. 移动端响应式缩放(通过CSS媒体查询)

  10. 扩展应用

// 动态尺寸示例
$graph = new PieGraph(
    $_GET['width'] ?? 600, 
    $_GET['height'] ?? 300
);
  1. 异常处理
    建议添加的健壮性检查:

if (!extension_loaded('gd')) {
    throw new RuntimeException('需要启用GD扩展');
}

这个初始化操作相当于准备画布,后续需要通过PiePlot类添加数据,最终调用Stroke()方法输出图像。实际项目中常配合缓存机制(如生成临时图片文件)提升性能。

4. 设置图表标题

$graph->title->SetFont(FF_CHINESE);            // 设置中文字体
$graph->title->Set('商场各类商品销售额比例');  // 设置图表标题
  • 这段代码是使用JpGraph图表库设置饼图标题的标准操作,解析如下:

  • 字体设置部分
    $graph->title->SetFont(FF_CHINESE) 实现原理:

  • FF_CHINESE 是JpGraph预定义的字体常量,对应支持中文的TTF字体(通常是simsun或微软雅黑)

  • 底层通过imagettftext()函数实现TrueType字体渲染

  • 必须确保服务器已安装对应中文字体库

  • 标题内容设置
    $graph->title->Set() 关键特性:

  • 自动处理多字节编码(GB2312/UTF-8转换)

  • 标题位置动态计算(默认居中于图表上方)

  • 支持HTML基础标签(如<b>加粗)

  • 工程实践要点

  • 中文乱码解决方案:


  • // 确保脚本文件编码与字体编码一致
    header("Content-type:text/html;charset=utf-8");
    $graph->title->Set(iconv('UTF-8', 'GB2312', '标题'))

  • 样式扩展方法:


  • $graph->title->SetColor('darkred');  // 设置标题颜色
    $graph->title->SetMargin(10);        // 设置边距(像素)

  • 可视化设计建议

  • 中文标题最佳长度:6-12个汉字

  • 字体大小推荐公式:

基础字号 = min(画布宽度, 画布高度) / 25
  • 多语言支持方案:


  • $lang = $_GET['lang'] ?? 'zh';
    $graph->title->Set($lang == 'en' ? 'Sales Ratio' : '销售比例');
  • 该代码段是数据可视化项目中的关键配置步骤,实际开发中建议封装成独立方法处理多语言和样式预设。注意JpGraph对中文的支持需要额外配置字体路径参数。


5. 创建3D饼图对象

$pieplot = new PiePlot3D($data);               // 创建3D饼图对象,传入数据数组
  • (1)功能和原理

  • 这段代码是使用JpGraph库创建3D饼图的核心操作,主要功能和实现原理如下:

  • 对象实例化

  • PiePlot3D是JpGraph专门处理三维饼图的类

  • 构造函数直接接收数据数组$data,数组格式通常为:[值1, 值2,...][['标签',值1],...]

  • 三维效果实现

  • 通过模拟光照阴影算法生成伪3D效果

  • 默认倾斜角度为15度(可通过SetAngle()调整)

  • 自动计算饼图厚度(约画布高度的20%)

  • 数据处理特性

  • 自动计算百分比和扇形角度

  • 支持数据标签自动避让(防止文字重叠)

  • 空值/零值数据会自动过滤

  • 工程应用要点

  • 典型数据预处理:


  • // 确保数据为数值型
    $data = array_map('floatval', $_POST['sales_data']);
  • 性能优化建议:


  • // 大数据集时关闭阴影提升渲染速度
    $pieplot->SetShadow(false);
  • 可视化增强技巧


  • $pieplot->SetCenter(0.4, 0.5);  // 调整圆心位置
    $pieplot->ExplodeSlice(2, 15);  // 突出第3个扇区
  • (2)数据映射

  • 该代码是数据可视化项目中的关键步骤,$pieplot = new PiePlot3D($data) 完成了数据映射,具体实现以下两种映射关系:

  • 数值到扇形区域的映射

    • $data数组中的每个数值对应饼图的一个扇形区块

    • 数值大小决定扇形的角度比例(例如数组[30,50,20]会生成占比30%、50%、20%的三个扇形)

  • 索引到图例标签的映射

    • 默认情况下,数组索引会与后续通过SetLegends()方法设置的标签顺序匹配

    • 若未显式设置标签,则显示为"Label 1"、"Label 2"等默认文本

  • 这种映射关系使得原始数据能自动转换为可视化元素,是JpGraph实现统计图表的核心机制之一。开发者可通过SetLabels()等方法进一步定制标签显示内容。

  • 因为这里已经映射完成,后续调用$graph->Add($pieplot)将绘图对象添加到画布即可。实际项目中建议配合AJAX实现动态数据加载。

6. 设置饼图位置

$pieplot->SetCenter(0.5, 0.5);                 // 设置饼图居中,参数为x和y坐标(0-1)


这段代码是使用JpGraph库调整饼图位置的核心方法,具体技术细节如下:

  1. 坐标系系统

  • SetCenter():设置饼图中心位置

  • 采用相对坐标系(0-1范围),

  • 参数1:x坐标(0-1范围,0为最左,1为最右)

  • 参数2:y坐标(0-1范围,0为最上,1为最下)

  • 其中:

    • (0,0) 表示画布左上角

    • (1,1) 表示画布右下角

  • 参数(0.5,0.5)实现数学精确居中,不受画布尺寸影响

  1. 布局引擎原理

  • 自动重新计算以下元素的位置:

    • 饼图主体半径

    • 标签位置

    • 图例框偏移量

  • 保持与其他图表元素的动态间距

  1. 工程应用场景

  • 多图表并列时需调整位置:

$pieplot->SetCenter(0.3, 0.5); // 左对齐布局
  • 响应式设计适配:

$pieplot->SetCenter(
    $_GET['x'] ?? 0.5,
    $_GET['y'] ?? 0.5
);
  1. 可视化设计建议

  • 黄金分割点参考:

    • (0.382, 0.5) 用于左侧放置图例

    • (0.618, 0.5) 用于右侧放置图例

  • 移动端优化方案:

$isMobile ? $pieplot->SetCenter(0.5, 0.4) : $pieplot->SetCenter(0.5, 0.5);

该方法直接影响图表的信息层级呈现,在商业智能(BI)系统中常用于突出关键数据模块。实际开发时建议配合SetSize()方法控制饼图直径,以获得最佳视觉平衡。


7. 准备图例数据

$department = array('IT数码', '家电', '日用', '服装', '食品'); // 设置各部分名称
  • 这段代码非常简单,就是定义了一个包含5个商品分类名称的数组:

  • 作用‌:存储商品分类名称,比如用于制作销售报表的饼图标签

  • 结构‌:按顺序存储了5个中文分类名

  • 使用场景‌:通常配合销售数据一起使用,例如:

$sales = [5000, 3000, 2000, 1500, 4000]; // 对应分类的销售额
  • 特点‌:

    • 数组下标从0开始自动编号

    • 可以直接用中文

    • 顺序会影响后续图表显示顺序

  • 简单来说,这就是一个存储分类名称的列表,为后续数据可视化做准备。

8. 设置图例

$pieplot->SetLegends($department);             // 为饼图设置图例
  • 这段代码的作用很简单:‌给饼图添加分类名称的图例说明‌。

  • 具体解释:

  • $pieplot 是饼图对象

  • SetLegends() 是设置图例的方法

  • $department 是之前定义的分类名称数组(比如包含"IT数码"、"家电"等)

  • 效果举例:
    当你的饼图显示各商品分类的销售占比时,这个方法会让饼图旁边自动显示对应的分类名称标签,就像这样:


  • 图例:
    □ IT数码 □ 家电 □ 日用 □ 服装 □ 食品
  • 注意事项:

  • 图例顺序会严格对应饼图扇区的顺序

  • 数组元素数量要和饼图数据一致

  • 支持中文等特殊字符显示

  • 这是数据可视化中最基础的功能之一,让图表更容易被理解。

9. 设置图例样式

$graph->legend->SetFont(FF_CHINESE);           // 设置图例字体
$graph->legend->SetLayout(LEGEND_HOR);         // 设置图例布局方式(水平)
$graph->legend->Pos(0.5, 0.98, 'center', 'bottom'); // 设置图例位置


这段代码是用来设置图表(特别是饼图)的图例样式的,主要包含三个设置项:

  1. ‌(1)字体设置
    $graph->legend->SetFont(FF_CHINESE)

  • SetFont():设置图例字体

  • 作用:指定图例使用中文字体

  • 效果:确保中文分类名称能正常显示

  • 注意:FF_CHINESE是预定义的字体常量

  1. (2)‌布局方式
    $graph->legend->SetLayout(LEGEND_HOR)

  • 作用:将图例设置为水平排列

  • 效果:图例项会从左到右排列(默认是垂直排列)

    SetLayout()方法在这里用于设置图例的布局方式,主要包含2个参数: LEGEND_HOR:表示水平排列图例项 LEGEND_VERT:表示垂直排列图例项(默认值)


  1. ‌(3)位置设置
    $graph->legend->Pos(0.5, 0.98, 'center', 'bottom')

  • Pos():设置图例位置。这句代码将使图例会显示在图表底部居中位置。

  • 关于$graph->legend->Pos()方法的参数说明如下:

  • 水平对齐方式参数‌:

  • 'center':将图例框水平居中于指定坐标位置

  • 'left':使图例框左边缘对齐指定坐标位置

  • 'right':使图例框右边缘对齐指定坐标位置

  • 该参数影响图例框相对于X坐标点的水平定位方式

  • 垂直对齐方式参数‌:

  • 'top':使图例框顶部对齐指定Y坐标位置

  • 'middle':使图例框垂直居中于指定Y坐标位置

  • 'bottom':使图例框底部对齐指定Y坐标位置

  • 该参数影响图例框相对于Y坐标点的垂直定位方式

  • 坐标参数说明‌:

  • 前两个数值参数(0.5, 0.98)表示相对坐标位置:

    • x坐标(0-1)。0.5表示水平方向50%位置(整个图表宽度的一半处)

    • y坐标(0-1)。0.98表示垂直方向98%位置(靠近图表底部)

  • 坐标范围是0-1的归一化值,代表相对于图表区域的百分比位置


  • 典型应用场景:
    当生成中文报表时,这段代码能确保:

  • 中文标签正常显示

  • 图例不会遮挡图表主体

  • 保持专业的数据可视化排版

  • 这是JpGraph等图表库中常见的图例配置方法。


  • 典型组合示例‌:

  • Pos(0.5, 0.5, 'center', 'middle'):将图例完全居中显示

  • Pos(0.1, 0.9, 'left', 'bottom'):将图例定位在左下角区域

  • Pos(0.95, 0.1, 'right', 'top'):将图例定位在右上角区域

  • 注意:这些参数组合可以精确控制图例在图表中的显示位置,避免遮挡关键数据区域。在JpGraph库中,这是最灵活的图例定位方式之一

10. 将饼图添加到画布

$graph->Add($pieplot);                         // 将3D饼图添加到统计图对象中


这段代码是JpGraph库中用于将3D饼图对象添加到统计图容器的关键操作。其核心功能和作用如下:

  1. 功能实现

    • $graph是PieGraph类的实例,作为统计图的画布容器

    • $pieplot是PiePlot3D类的实例,包含3D饼图的所有数据和样式配置

    • 前面$pieplot = new PiePlot3D($data);已经做好了相关数据的映射。这里使用Add()方法将两者进行关联,使饼图数据最终能渲染到画布上。


  2. 典型使用场景
    该代码通常出现在以下完整流程中:

$graph = new PieGraph(600,500);        // 创建画布
$pieplot = new PiePlot3D($data);       // 创建3D饼图对象
$graph->Add($pieplot);                 // 关键关联操作
$graph->Stroke();                      // 输出图像
  1. 这种调用顺序是JpGraph绘制统计图的标准流程

  2. 技术特点

    • 采用组合模式设计,统计图对象作为容器管理多个子图表

    • 支持链式调用,可与其他配置方法组合使用

    • 必须在调用Stroke()输出图像前执行此操作

该方法是JpGraph实现统计图可视化的核心环节,缺少此步骤将导致图像无法正常生成。

11. 输出图像

$graph->Stroke();                              // 渲染并输出图表


$graph->Stroke() 是 JpGraph 库中用于生成并输出图表的最终执行方法,其核心功能和工作原理如下:

  1. 核心作用
    该方法触发完整的图表渲染流程,将之前通过Add()添加的图表对象、配置的样式属性以及数据转换为可视化的图像输出。相当于图像处理的"执行命令"。

  2. 技术实现

    • 内部自动处理坐标计算、颜色填充、文字排版等绘图操作

    • 根据浏览器环境自动选择输出格式(默认PNG,可通过SetImgFormat()修改)

    • 生成HTTP头信息(如Content-Type: image/png)直接输出到响应流

  3. 典型特征

    • 必须是代码链中最后一个调用的方法

    • 调用后程序流程终止(类似die()的效果)

    • 与PHP的header()函数冲突,需确保之前没有输出任何内容

  4. 输出控制
    可通过参数指定输出方式:

$graph->Stroke('filename.png');  // 保存为文件
$graph->Stroke();                // 直接输出到浏览器

该方法是JpGraph工作流程的最终环节,缺少此调用则所有配置都不会生效,图表也无法显示。其设计体现了"延迟渲染"的思想,只有执行时才真正消耗计算资源。


注意事项

  1. 确保JpgGraph库文件路径正确,示例中路径为src/,实际使用时可能需要调整

  2. 服务器需要支持GD库,否则无法生成图像

  3. 中文字体需要在服务器上安装,否则可能显示为方框

  4. 数据数组和图例数组的长度必须一致

  5. 图像尺寸不宜过大,否则可能影响性能

  6. 在生产环境中,建议将图像保存到文件而不是直接输出

通过以上步骤,您就可以在PHP中使用JpGraph生成一个完整的3D饼形图了。


技术拓展和进阶


一、核心文件与类结构详解

  1. 基础文件作用

  • jpgraph.php:核心图形引擎(处理坐标轴、颜色管理等)

  • jpgraph_pie.php:基础饼图功能(二维饼图、环形图等)

  • jpgraph_pie3d.php:在基础饼图上扩展的3D效果模块

  1. 关键类说明

  • PieGraph类(画布):

    • 构造参数:new PieGraph(宽度, 高度) 单位是像素

    • 重要方法:
      SetMargin(左,右,上,下) - 设置边距
      SetFrame(true/false) - 是否显示边框
      SetShadow() - 设置画布阴影

  • PiePlot3D类(3D饼图):

    • 构造参数:new PiePlot3D(数据数组)

    • 特色方法:
      SetAngle(角度) - 3D倾斜角度(默认55度)
      ExplodeSlice(序号,距离) - 突出某块扇形
      SetColor('颜色名') - 设置整体配色

二、中文处理全流程

  1. 字体设置标准写法

$graph->title->SetFont(FF_SIMSUN, FS_BOLD);  // 宋体加粗
$graph->legend->SetFont(FF_CHINESE, FS_NORMAL);

可用中文字体常量:

  • FF_SIMSUN(宋体)

  • FF_CHINESE(系统默认中文)

  • FF_MSYH(微软雅黑,需额外配置)

  1. 防乱码技巧

  • 文件保存为UTF-8无BOM格式

  • 数据库数据需先做iconv('原编码','UTF-8',$str)转换

三、数据与样式优化实践

  1. 数据预处理建议

// 过滤负数
$data = array_filter($data, function($v){ return $v > 0; }); 
// 自动计算百分比
$total = array_sum($data);
$percent = array_map(function($v) use ($total){
    return round($v/$total*100,1).'%';
}, $data);
  1. 视觉增强方案

// 设置渐变色
$pieplot->SetSliceColors([
    '#FF6B6B','#4ECDC4','#45B7D1', 
    '#FFA07A','#98D8C8'
]);
// 添加数值标签
$pieplot->SetLabels($percent);
$pieplot->SetLabelPos(0.7); // 标签位置
// 3D效果调节
$pieplot->SetEdge('black', 1); // 边缘线
$pieplot->SetAngle(45); // 最佳视角角度

四、常见问题解决方案

  1. 图片不显示排查步骤:

  • 检查php.ini中gd扩展是否启用

  • 确保没有在Stroke()前输出空格/空行

  • 测试简单图形能否显示(排除数据问题)

  1. 性能优化方案:

// 启用缓存(需提前创建cache目录)
define('CACHE_DIR','/tmp/jpgraph_cache');
$graph->SetCaching(true);
// 大数据量时降低质量提升速度
$graph->SetQuality(75); // 默认100

五、实际项目建议

  1. 推荐封装成函数:

function createPie3D($data, $labels, $title=''){
    require_once 'src/jpgraph.php';
    require_once 'src/jpgraph_pie.php';
    require_once 'src/jpgraph_pie3d.php';
    
    $graph = new PieGraph(800, 500);
    $graph->SetMargin(50,50,60,30);
    // ...其余配置...
    
    return $graph->Stroke();
}
  1. 企业级应用注意:

  • 高并发场景建议预生成图片

  • 重要图表建议添加水印

  • 生产环境关闭调试模式:

$graph->SetDebug(false);

六、学习资源推荐

  1. 官方示例重点看:

  • /examples/pie/examples/下的pie3dex*.php系列

  • /examples/legacy/中的经典案例

  1. 调试技巧:

  • 临时保存图片查看:

$graph->Stroke('/tmp/debug.png');
echo '<img src="/tmp/debug.png">';
  1. 版本选择建议:

  • PHP 7.4+选择JpGraph 4.2+

  • PHP 5.x使用JpGraph 3.5

通过以上细节处理,可以制作出专业级的3D饼图报表系统。实际开发时建议先完成核心功能,再逐步添加视觉效果。



标签: