用豆包写了个“百公里油耗费用计算器”

主包提车3个多月开了2000公里,平时会不定时刷下吉利的APP,里面有一个行车日志模块,可以看到每一次出行的距离和油耗。结合平日加油时的油价,可以算出百公里烧油的成本(计算公式:距离 ÷ 100 × 油耗 × 每升油价)。

行车日志可以看到单次行程的油耗行车日志可以看到单次行程的油耗

于是我打算写一个计算器,方便平时计算油耗花费(有一说一,确实自己开车比较省钱啊!自己开差不多0.6-0.8元/km,打车差不多1.5元/km😂)。

这次用 豆包AI编程功能来试试,前段时间尝试过用豆包写一个3-4页面的小项目,挑战失败了,这次看看单页面能不能挑战成功😀

一、前期准备

说回开头提到的计算公式:距离 ÷ 100 × 油耗 × 每升油价,这意味着有3个参与计算的变量,因为计算的是百公里油耗,所以距离就变成常量了,只需要考虑输入油耗每升油价油耗肯定是需要自己输入的,油价倒是可以通过API获取。但是不同地区的油价又不一致,所以还要考虑省份这个变量。那么方案大概就出来了:

  1. 上策:只输入油耗,通过接口自动获取省份,通过省份获取油价,然后进行计算;
  2. 中策:输入油耗,手动选择省份,通过省份获取油价,然后进行计算;
  3. 下策:不管省份,手动输入油耗油价,然后进行计算;

根据上面的方案,需要寻找2个API接口:根据IP获取省份、根据省份获取油价。通过一番搜索找到了 MXNZP,这俩接口正好都能提供,那就开始吧。

接口信息接口信息

二、开始编码

提示词:

使用tailwind+JQuery编写一个《百公里油耗价格查询》页面,有如下要求:

1、页面头部展示访问者的省份信息

2、列表展示当前省份的油价信息(柴油、92、95、98的价格);

3、在列表右上方提供省份切换按钮;

4、提供一个【加油类型】单选框,可以选择柴油、#92、#95、#98;

5、提供一个【百公里油耗】输入框,可以输入【具体油耗】;

6、根据【加油类型】的油价 ×【具体油耗】计算出【油耗价格】;

让我们逐步完成页面,请先完成第一步

之前尝试用豆包写另一个项目的时候,一次性让豆包生成了太多行代码,导致多次对话后生成的代码BUG层出不穷,这次尽可能让AI少生成些代码😥。

芜湖,UI效果还不错,这个样式的网站我最近看到好多,原来都是AI生成的😂芜湖,UI效果还不错,这个样式的网站我最近看到好多,原来都是AI生成的😂

2.1、页面头部展示访问者的省份信息

提示词:

获取用户IP地址我使用的是这个免费API,文档地址是https://www.mxnzp.com/doc/*** 。请参考文档内容完成获取地址的功能

UI中看不出来,其实已经实现了这个APIUI中看不出来,其实已经实现了这个API

2.2、在列表右上方提供省份切换按钮

提示词:

我希望获取不到IP所在省份时,用户也可以手动选择省份,当然,用户也可以随时切换省份

增加容错性,考虑到通过IP获取省份毕竟是第三方接口,也存在不稳定性。增加切换省份后如果API接口异常,用户也能继续使用。

豆包写UI是真的快,风格也挺不错豆包写UI是真的快,风格也挺不错

提示词:

由于下一步获取省份油价需要用到接口https://www.mxnzp.com/doc/***,文档中省份的合法值与你提供的不一致

提示词:
我需要指出一个问题,你提供的{ name: “新疆维吾尔自治区”, code: “xinjiang” }其实不对。

油价接口中province与IP地址province的对应关系应该是这样的:

浙江省 → 浙江(过滤“省”)

西藏自治区 → 西藏(过滤“自治区”)

而像广西壮族自治区、宁夏回族自治区、新疆维吾尔自治区等仅保留前两个字

这些需要做特殊处理

从这开始可以看出豆包读文档的能力还是比较一般,“通过IP获取省份”接口的province字段是XX省、XX市、XX自治区,而“获取油价”接口的province字段只需要XX。好在经过2次提示,豆包也解决了这个问题。

提示词:

出错了,控制台报错ncaught Error: Syntax error, unrecognized expression: …

JQuery拼接的小问题,肉眼没看出来,AI倒是很快发现了

2.3、列表展示当前省份的油价信息

提示词:

很好,现在开始第二步,在自动获取城市或者切换城市后,调用城市油价查询接口(文档https://www.mxnzp.com/doc/***),获取各型号的油价并展示内容

这一步也顺利完成了,AI的设计风格比较扁平化,有点像老外网站的风格

油价卡片展示效果油价卡片展示效果

2.4、剩下的3步

提示词:

继续实现吧

这次AI完成了加油类型选择油耗计算功能,该说不说这个样式我喜欢,出UI的速度效果我也挺满意,这比我手工画结构和写样式快多了。测试了一下已经基本满足使用了,后面就是继续优化的工作。

计算卡片样式计算卡片样式

三、开始优化

3.1、修复自动获取省份和接口限制问题

提示词:

每次进入页面时调用一次IP地址查询接口,获取所在省份

我发现在AI完成省份切换功能后,自动获取省份的功能失效了(看了是代码被覆盖了),通过上述提示词后问题解决。

3.2、调整样式和允许编辑价格

提示词:

当获取油价失败时,我希望仍展示油价界面,允许用户自己编辑价格,同理:正常获取数据时也应该允许用户自主修改价格。

增加一个油价编辑功能,有2个考量:一是这样做即使接口获取失败,也提供了兜底方案;二是有些小加油站的价格会略低于该省公布价格,用户可以自行调整

支持油价编辑功能支持油价编辑功能

四、人工编码

最初替换完APP_ID和APP_SECRET,接口就能正常工作。后面发现会获取不到油价数据,输出了接口错误信息后,才发现这个免费接口有QPS限制,每秒只能请求一次接口。当我调用了“IP获取省份”接口后,下一个“获取油价”接口也是瞬间发出,就会超出每秒请求频率限制。

接口报错信息接口报错信息

4.1、切换获取IP所在省份接口

如果“IP获取省份”和“获取油价”接口只能二选一,那肯定是优先保障“获取油价”接口的调用,于是我开始寻找有没有可用的第三方服务,最后在知乎找到一个仍可使用的方案,于是我手动替换了这部分逻辑代码。

很幸运的在知乎上看到一个答案很幸运的在知乎上看到一个答案

4.2、通过定时任务每日读取并存储油价信息

目前的油价信息是通过接口实时获取的,这还存在着3个问题:

  1. 接口仍然受请求频率限制,页面访问量稍大就有可能触发错误;
  2. 将我申请的APP_ID和APP_SECRET直接写在页面中,这并不是安全的做法。
  3. 免费接口存在1000次/日的调用数量限制,存在单日调用次数耗尽的风险。

所以我决定使用cron定时任务,每天固定时间调用接口,并将结果缓存为json文件,之后页面访问则从json文件中读取数据。一举两得,既解决了敏感信息的安全性问题,又解决了接口请求频率限制的问题。同样的,这部分代码也需要我手动完成并进行替换。

通常对于含后端的网站,做法应是由后端的某个服务去调用接口,然后把数据存储在Mysql或Redis/Mongo中,再开发接口给前端读取(相当于做了一层接口代理,隐去了功能的业务细节)。但我的博客页面是通过Hexo渲染生成(SSG)的页面,再部署一个API服务只会徒增项目复杂性,所以我没有这么做。

💡 缓存接口更好的方式

目前我是每天拉取缓存一次数据,主要是操作简单。但我有一个更经济的想法,有兴趣的读者可以留作参考。

根据《关于进一步完善成品油价格形成机制的通知(发改价格[2013]624 号)》可知,我国的油价计价周期规则是每10个工作日计算变化一次。通过第三方接口获取次年的工作日区间,然后根据上一次油价调整日期即可推出次年所有的油价变化日期(甚至我觉得会有这种现成的第三方接口),这就可以减少90%的接口调用次数(如果接口需要收费时,这种做法就相当经济了😂)。

4.3、增加输入限制

在豆包生成的代码中,输入框部分的代码如下所示,它存在2个问题,仍需要我手动解决:

  1. 试图输入小数时,由于监听的是input事件,当输入.时就会触发parseFloat进行保留小数操作,导致永远无法输入小数;
  2. 没有限制输入位数,number类型也不支持字符长度限制,用户可以输入7.6111111等不符合的价格;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<input 
type="number"
id="gas92-price"
class="..."
step="0.01"
min="0"
/>

<script>
// 油价输入框变化时自动计算
$("#gas92-price, ...").on("input", function() {
// 保留两位小数
const value = parseFloat($(this).val()) || 0;
$(this).val(value.toFixed(2));

// 自动重新计算
calculateFuelCost();
});
</script>

五、最终成品

虽然人工排查和编码调整的过程占据了大部分时间,但是我仍满意豆包的效果。原因有二,一是豆包设计的UI界面风格挺不错(扁平极简风格);二是这个单页面的代码量达到了600行,输出的代码仍然可以正常运行,没有什么严重的BUG。相比去年使用GPT-4o生成的半成品大富翁BUG版(300多行代码),已经有了很大的长进了。

代码量已经来到了600行代码量已经来到了600行

最终效果最终效果

👉 体验地址:戳我访问

用豆包写了个“百公里油耗费用计算器”

作者:有点东西

链接: https://www.youdiandongxi.com/article/try-doubao-create-tool.html

协议:本文采用 CC BY-NC-SA 4.0 隐私协议,转载请注明出处!

评论区