用Cursor一天开发上线一个FinClip小程序

1,325 阅读3分钟

背景介绍

最近接到一个有趣的任务:开发一个模拟炒股的移动端应用。由于之前已经开发过Web版本,为了避免重复造轮子,我决定基于原有代码进行改造,继续使用React技术栈。

同时,为了提升开发效率,我选择了当下炙手可热的AI编程助手Cursor来协助开发。让我们看看能否用一天时间就完成整个项目!

开发全过程

第一步:快速搭建项目框架

首先,让Cursor帮我搭建基础框架。我的需求很简单:

帮我搭建一个React应用框架,需要包含以下四个页面:
1. 登录页 - 用户身份验证
2. 首页 - 展示行情概览
3. 交易页 - 实现股票交易
4. 详情页 - 展示股票详情

先搭建基础结构,具体页面内容稍后实现。

几秒钟后,Cursor就生成了一个包含完整路由配置和基础组件的项目框架:

项目初始化完成

快速验证一下:

yarn install  # 安装项目依赖
yarn start    # 启动开发服务器

完美!项目成功运行,路由跳转正常:

项目运行效果

第二步:首页UI开发

有了框架,接下来是最具挑战性的部分 - 还原设计稿。我们的设计稿是标准的移动端750px设计:

设计稿预览

将设计稿提供给Cursor,并说明需求:

这是首页设计稿(750px宽度),请帮我实现对应的页面内容

Cursor的第一版还原度达到了80%:

Cursor还原效果

经过一些细节调整后,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处理

首页功能开发完成,其他功能也是类似的步骤,这里就不再赘述。

第四步:真机预览

所有功能开发完成后,是时候看看实际效果了:

  1. 打包项目:
yarn build
  1. 使用Finclip Studio 打开构建产物,点击预览:

预览二维码

  1. Finclip App扫码即可查看真机效果

第五步:一键发布

预览通过后,发布流程超级简单:

  1. 点击上传按钮
  2. 选择"小程序"
  3. 输入版本号
  4. 确认上传

发布界面

等待审核通过,小程序就正式上线了!

总结

借助Cursor的强大能力,我们只用了一天时间就完成了从开发到上线的全过程。这个效率相当惊人 - 要知道传统开发方式至少需要一周时间。AI编程助手确实为开发效率带来了革命性的提升!