背景介绍
最近接到一个有趣的任务:开发一个模拟炒股的移动端应用。由于之前已经开发过Web版本,为了避免重复造轮子,我决定基于原有代码进行改造,继续使用React技术栈。
同时,为了提升开发效率,我选择了当下炙手可热的AI编程助手Cursor来协助开发。让我们看看能否用一天时间就完成整个项目!
开发全过程
第一步:快速搭建项目框架
首先,让Cursor帮我搭建基础框架。我的需求很简单:
帮我搭建一个React应用框架,需要包含以下四个页面:
1. 登录页 - 用户身份验证
2. 首页 - 展示行情概览
3. 交易页 - 实现股票交易
4. 详情页 - 展示股票详情
先搭建基础结构,具体页面内容稍后实现。
几秒钟后,Cursor就生成了一个包含完整路由配置和基础组件的项目框架:
快速验证一下:
yarn install # 安装项目依赖
yarn start # 启动开发服务器
完美!项目成功运行,路由跳转正常:
第二步:首页UI开发
有了框架,接下来是最具挑战性的部分 - 还原设计稿。我们的设计稿是标准的移动端750px设计:
将设计稿提供给Cursor,并说明需求:
这是首页设计稿(750px宽度),请帮我实现对应的页面内容
Cursor的第一版还原度达到了80%:
经过一些细节调整后,UI还原度更上一层楼:
第三步:接口对接
UI搞定后,就该让页面"活"起来了。以排行榜数据为例,我们需要实现接口调用。让Cursor帮我们封装请求:
帮我封装排行榜数据接口,要求:
- 使用axios
- 统一处理请求/响应
- 接口路径:/user/ranking
- 返回排行榜列表数据
Cursor生成了一套完整的网络请求方案:
request.ts - 统一请求封装
import axios from 'axios';
import { Toast } from 'antd-mobile';
const request = axios.create({
baseURL: '/api',
timeout: 10000,
});
// 请求拦截器:统一处理token等
request.interceptors.request.use(
(config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error)
);
// 响应拦截器:统一处理错误等
request.interceptors.response.use(
(response) => {
const { data } = response;
if (data.code === 200) {
return data.data;
}
Toast.show({ content: data.message || '请求失败' });
return Promise.reject(data);
},
(error) => {
Toast.show({ content: error.message || '网络错误' });
return Promise.reject(error);
}
);
export default request;
ranking.ts - 排行榜接口
import request from '@/utils/request';
export interface RankingItem {
id: number;
username: string;
profit: number;
rank: number;
}
export const getRankingList = () => {
return request.get<RankingItem[]>('/user/ranking');
};
Home.tsx - 页面逻辑
import { useEffect, useState } from 'react';
import { getRankingList, RankingItem } from '@/api/ranking';
import styles from './index.module.scss';
const Home = () => {
const [rankingList, setRankingList] = useState<RankingItem[]>([]);
const [loading, setLoading] = useState(false);
const fetchRankingList = async () => {
setLoading(true);
try {
const data = await getRankingList();
setRankingList(data);
} catch (error) {
console.error('获取排行榜失败:', error);
}
setLoading(false);
};
useEffect(() => {
fetchRankingList();
}, []);
return (
<div className={styles.container}>
<div className={styles.card}>
<div className={styles.header}>
<div>排行榜</div>
</div>
<div className={styles.content}>
{loading ? (
<div className={styles.loading}>加载中...</div>
) : (
rankingList.map((item) => (
<div key={item.id} className={styles.rankItem}>
<span className={styles.rank}>{item.rank}</span>
<span className={styles.username}>{item.username}</span>
<span className={styles.profit}>{item.profit}%</span>
</div>
))
)}
</div>
</div>
</div>
);
};
export default Home;
这套方案的亮点:
- 统一的请求/响应处理
- 完善的错误处理机制
- TypeScript类型支持
- 优雅的加载状态
- 规范的token处理
首页功能开发完成,其他功能也是类似的步骤,这里就不再赘述。
第四步:真机预览
所有功能开发完成后,是时候看看实际效果了:
- 打包项目:
yarn build
- 使用Finclip Studio 打开构建产物,点击预览:
- 用Finclip App扫码即可查看真机效果
第五步:一键发布
预览通过后,发布流程超级简单:
- 点击上传按钮
- 选择"小程序"
- 输入版本号
- 确认上传
等待审核通过,小程序就正式上线了!
总结
借助Cursor的强大能力,我们只用了一天时间就完成了从开发到上线的全过程。这个效率相当惊人 - 要知道传统开发方式至少需要一周时间。AI编程助手确实为开发效率带来了革命性的提升!