Skip to content

如果我是这个“旅搭出行”项目的软件开发负责人,而且只有我一个开发,我不会一上来就猛写代码。 我会把自己拆成几个角色来工作:

产品负责人:决定做什么、不做什么
架构负责人:决定系统边界、模块边界、数据边界
后端开发:实现业务能力和接口契约
前端开发:实现 web 管理后台
移动端开发:实现 uni-app 用户端
测试人员:写验收用例、联调清单、异常场景
运维人员:部署、日志、监控、备份、发布流程
UI 设计:交给 AI 生成风格和页面参考

重点不是“一个人硬扛所有事情”,而是:

一个人用 AI 把团队角色拆出来,然后按流程推进。


一、项目定位:先明确“旅搭出行”到底是什么 ​

我会先把项目定义成:

一个面向年轻用户的出行搭子 / 活动社交平台,用户可以发布活动、报名活动、寻找同行搭子,后台运营人员负责内容审核、用户管理、活动管理、订单/报名管理、投诉反馈、运营配置和数据统计。

第一阶段不要做成大而全的旅游平台,也不要一开始做复杂 OTA、酒店、机票、行程商城。

第一阶段核心应该是:

用户注册登录
用户资料
活动发布
活动报名
搭子匹配
动态发布
评论互动
消息通知
后台审核
后台配置
基础运营

也就是先做一个:

活动 + 搭子 + 内容审核 + 运营后台

而不是一上来做:

携程 + 小红书 + Soul + 微信群 + 电商订单系统

那样一个人很容易做散。


二、整体系统组成 ​

我会拆成四个项目:

litour-backend     后端 Spring Boot 项目
litour-web-admin   Web 管理后台 Vue3 项目
litour-uniapp      移动端 uni-app 项目
litour-docs        项目文档 / 接口契约 / 需求文档 / 测试用例

如果你现在已经有三个项目,也可以不单独建 litour-docs,直接在 backend 或根目录维护:

docs/
├── product
├── API
├── database
├── test
├── deploy
└── prompt

但是长期来看,我更建议文档独立管理,或者至少作为 monorepo 根目录的一部分。


三、我会采用的总开发策略 ​

我不会采用“前端先做完,然后后端补接口”,也不会采用“后端先把所有表设计完,再做前端”。

我会采用:

业务流程驱动
接口契约先行
前后端 mock 并行
后端逐步真实实现
联调逐模块推进

整体流程是:

1. 先定 MVP 范围
2. 按模块画出业务流程
3. 为每个模块写接口契约
4. web / uni-app 先用 mock 跑页面
5. backend 按接口契约实现
6. 前端逐个模块切真实接口
7. 每个模块联调完成后冻结契约
8. 最后统一测试、部署、监控

核心原则:

前端 mock 可以先存在
但最终必须沉淀为 API 契约

后端字段可以复杂
但对外接口必须稳定

web 和 uni-app 可以有各自接口
但底层业务能力尽量复用

四、项目角色怎么由 AI 分工 ​

我会给 AI 分配固定角色,而不是随便问。

1. 产品经理 AI ​

负责:

整理需求
拆模块
写用户故事
写业务流程
写验收标准
判断功能优先级

输出文件:

docs/product/01-项目定位.md
docs/product/02-MVP功能范围.md
docs/product/03-用户端需求.md
docs/product/04-管理后台需求.md
docs/product/05-业务流程.md

2. 架构师 AI ​

负责:

模块边界
DDD 聚合设计
数据库设计
接口风格
权限模型
异常补偿
状态机
部署结构

输出文件:

docs/architecture/01-系统架构.md
docs/architecture/02-模块边界.md
docs/architecture/03-DDD领域模型.md
docs/architecture/04-权限模型.md
docs/architecture/05-状态机设计.md

3. 后端开发 AI ​

负责:

Spring Boot 代码
Controller
Application Service
Domain Service
Repository
MyBatis-Plus Mapper
权限校验
接口实现
单元测试

输出:

backend 代码
docs/API 接口契约
docs/database 表结构文档

4. 前端开发 AI ​

负责 web-admin:

菜单
路由
权限控制
页面开发
表格
表单
审核弹窗
运营配置页面
接口封装
mock 数据

5. 移动端开发 AI ​

负责 uni-app:

首页
活动列表
活动详情
报名
发布活动
搭子匹配
我的页面
消息通知
登录授权

6. 测试 AI ​

负责:

测试用例
联调 checklist
异常场景
边界数据
接口测试
回归测试

7. 运维 AI ​

负责:

Dockerfile
Docker Compose
Nginx
MySQL
Redis
日志目录
备份脚本
发布脚本
监控方案

五、项目模块规划 ​

我会先按业务能力拆模块,而不是按页面拆。

用户端 app 模块 ​

认证模块
用户模块
活动模块
搭子匹配模块
动态模块
评论模块
通知模块
文件上传模块
微信支付回调模块
通用模块

对应你现在的 app 文档结构基本合理:

docs/API/app
├── 00-INDEX.md
├── 01-认证模块.md
├── 02-用户模块.md
├── 03-活动模块.md
├── 04-搭子匹配模块.md
├── 05-通知模块.md
├── 06-Post动态模块.md
├── 07-Comment评论模块.md
├── 08-Topic话题模块.md
├── 09-文件上传.md
├── 10-通用模块.md
└── 11-微信支付回调.md

web-admin 模块 ​

认证与管理员
用户管理
内容审核
活动与订单
系统配置
运营管理
数据统计
客服反馈
系统监控
通用工具

你现在这个结构也可以继续用:

docs/API/web-admin
├── 00-INDEX.md
├── 01-认证与管理员.md
├── 02-用户管理.md
├── 03-内容审核.md
├── 04-活动与订单.md
├── 05-系统配置.md
├── 06-运营管理.md
├── 07-数据统计.md
├── 08-客服反馈.md
├── 09-系统监控.md
└── 10-通用工具.md

common 通用接口 ​

我会额外加:

docs/API/common
├── 01-文件上传.md
├── 02-字典枚举.md
├── 03-地区城市.md
├── 04-验证码.md
├── 05-通用配置.md
└── 06-通用响应结构.md

因为有些接口不属于 app,也不属于 web-admin。

比如:

文件上传
字典枚举
城市地区
验证码
系统配置读取
协议内容

这些可以抽到 common。


六、接口契约管理方案 ​

这是你当前最关心的地方。

我会规定:

所有接口新增之前,必须先进入 docs/API
所有字段命名,必须先进入接口契约
所有 mock 数据,必须来自接口契约
所有后端实现,必须对齐接口契约

也就是说:

docs/API 是唯一接口契约中心

不是前端 mock 说了算,也不是后端 Entity 说了算。

真正说了算的是:

业务需求 + API 契约

每个接口文档统一模板 ​

我会让每个接口都按这个格式写:

## 接口名称

### 基本信息

| 项 | 内容 |
|---|---|
| 接口名称 | 活动列表 |
| 接口归属 | app |
| 请求方式 | GET |
| 请求路径 | /api/app/activities |
| 是否需要登录 | 否 |
| 权限码 | 无 |
| 状态 | 待后端开发 |
| 是否复用 | 否 |
| 复用说明 | 复用活动领域服务,不复用后台接口 |

### 使用场景

用户端首页 / 活动列表页展示可报名活动。

### 请求参数

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | string | 否 | 搜索关键词 |
| cityCode | string | 否 | 城市编码 |
| pageNo | number | 是 | 页码 |
| pageSize | number | 是 | 每页数量 |

### 响应字段

| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 活动ID |
| title | string | 活动标题 |
| coverUrl | string | 封面图 |
| cityName | string | 城市名称 |
| startTime | string | 开始时间 |
| applyCount | number | 已报名人数 |
| maxPeople | number | 最大人数 |
| status | string | 活动状态 |
| statusName | string | 活动状态文案 |

### 响应示例

```json
{
  "code": "0000",
  "message": "success",
  "data": {
    "records": [
      {
        "id": "10001",
        "title": "周末东京 City Walk",
        "coverUrl": "https://xxx.com/a.jpg",
        "cityName": "东京",
        "startTime": "2026-06-01 10:00:00",
        "applyCount": 8,
        "maxPeople": 12,
        "status": "PUBLISHED",
        "statusName": "报名中"
      }
    ],
    "total": 1
  }
}

异常情况 ​

code说明
40001参数错误
50000系统异常

联调备注 ​

  • app 只展示已发布活动
  • 不返回审核备注
  • 不返回后台风控字段
---

## 接口状态必须明确

我会定义接口状态:

```text
mock中
待后端开发
后端开发中
后端已完成
联调中
已联调
已上线
废弃

这样你在 vibe coding 的时候,不会乱。

比如:

| 接口名称 | 端 | 方法 | 路径 | 状态 |
|---|---|---|---|---|
| 活动列表 | app | GET | /api/app/activities | mock中 |
| 活动详情 | app | GET | /api/app/activities/{id} | 待后端开发 |
| 活动审核列表 | web-admin | GET | /api/admin/activity/audit/page | 已联调 |

七、web 和 uni-app 接口是否复用的判断规则 ​

我不会强行要求 web 和 uni-app 复用同一个接口。

我会分三类。

第一类:可以直接复用 ​

例如:

文件上传
验证码
地区城市
字典枚举
协议内容
图片资源

这种可以放到:

/api/common/xxx

第二类:不能复用接口,但可以复用业务服务 ​

例如:

活动列表
活动详情
用户详情
动态详情
评论列表
订单详情

app 和 web-admin 都需要,但是视角不同。

app 关注:

能不能展示
能不能报名
用户看到什么
是否已收藏
是否已报名

web-admin 关注:

审核状态
创建人
举报数
下架原因
审核记录
内部备注
操作日志

这种我会设计成:

/api/app/activities/{id}
/api/admin/activities/{id}

Controller 分开,但后端复用:

ActivityApplicationService
ActivityDomainService
ActivityRepository

第三类:完全独立接口 ​

例如:

后台管理员登录
后台角色权限
后台运营配置
后台系统监控
app 用户报名
app 搭子匹配
app 发布动态

这些不需要强行复用。


八、后端架构设计 ​

你的项目是重后端,我会坚持后端主导业务能力。

后端使用:

Spring Boot 3.4
JDK 17
MyBatis-Plus
MySQL
Redis
Spring Security
JWT
Knife4j / Swagger
Docker
Nginx

项目结构我会按模块 + 六边形架构组织。

大概是:

backend
├── litour-bootstrap
├── litour-common
├── litour-infrastructure
├── litour-domain
├── litour-application
└── litour-adapter

如果你觉得多模块太重,也可以先用单体模块,但包结构按六边形分:

com.litour
├── common
├── security
├── module
│   ├── auth
│   ├── user
│   ├── activity
│   ├── match
│   ├── post
│   ├── comment
│   ├── notification
│   ├── admin
│   ├── permission
│   └── system
└── infrastructure

后端 Controller 分端 ​

我会明确分:

app 端接口
admin 端接口
common 通用接口
callback 回调接口

例如:

controller
├── app
│   ├── AppAuthController
│   ├── AppUserController
│   ├── AppActivityController
│   └── AppPostController
├── admin
│   ├── AdminAuthController
│   ├── AdminUserController
│   ├── AdminActivityController
│   └── AdminAuditController
├── common
│   ├── FileController
│   └── DictController
└── callback
    └── WechatPayCallbackController

接口路径统一:

/api/app/**
/api/admin/**
/api/common/**
/api/callback/**

后端不要让 Entity 直接返回前端 ​

我会严格分:

Entity:数据库表映射
Domain:领域对象
Command:写操作入参
Query:查询入参
DTO:应用层数据
VO:接口响应

例如:

ActivityEntity
ActivityAggregate
CreateActivityCommand
ActivityPageQuery
ActivityDetailDTO
AppActivityDetailVO
AdminActivityDetailVO

app 和 admin 可以使用不同 VO:

AppActivityDetailVO
AdminActivityDetailVO

这可以避免一个接口返回越来越臃肿。


九、权限系统方案 ​

你前面已经遇到权限码不一致的问题,所以我会一开始就定死规则。

权限码格式 ​

module:resource:action

例如:

system:admin-user:list
system:admin-user:view
system:admin-user:create
system:admin-user:update
system:admin-user:delete

content:post:list
content:post:view
content:post:approve
content:post:reject

activity:activity:list
activity:activity:view
activity:activity:approve
activity:activity:reject
activity:activity:offline

权限来源 ​

我会规定:

后端权限字典是唯一来源
前端路由 meta.permission 必须对齐后端权限码
数据库 permissions 表由后端初始化或脚本维护

不要让前端随便写权限码。


登录返回 ​

后台登录返回:

{
  "token": "xxx",
  "userInfo": {
    "id": "1",
    "nickname": "管理员"
  },
  "permissions": [
    "system:admin-user:list",
    "content:post:approve"
  ],
  "menus": []
}

前端根据:

permissions 控制按钮
menus 或 asyncRoutes 控制菜单

但是最终安全依然在后端:

@PreAuthorize("hasAuthority('content:post:approve')")

十、数据库设计策略 ​

我不会一次性把所有表设计到极致。

我会分阶段:

第一阶段核心表 ​

用户表
用户资料表
管理员表
角色表
权限表
角色权限表
管理员角色表
活动表
活动报名表
动态表
评论表
通知表
文件表
审核记录表
系统配置表
操作日志表

第二阶段扩展表 ​

搭子匹配偏好表
搭子匹配记录表
话题表
用户收藏表
举报表
反馈表
订单表
支付流水表
退款记录表
消息会话表

第三阶段运营数据表 ​

活动浏览统计
用户行为日志
转化统计
运营活动配置
推荐权重配置
风控记录

十一、前端 web-admin 方案 ​

web-admin 我不会做得花里胡哨。

目标是:

运营人员能用
审核人员能用
自己能维护
权限清晰
页面稳定

技术栈:

Vue3
Vite
TypeScript
Pinia
Vue Router
Element Plus
Axios
Mock

后台页面结构:

登录
首页工作台
用户管理
内容审核
活动管理
报名 / 订单管理
运营配置
数据统计
客服反馈
系统配置
权限管理
系统监控

web-admin 开发方式 ​

我会让 web 先基于 mock 跑通:

页面
表格
搜索
分页
详情
审核弹窗
新增编辑表单
权限控制

但是 mock 文件必须和 API 文档同步。

也就是:

mock 数据不是随便写
mock 数据必须来自 docs/API

十二、uni-app 移动端方案 ​

uni-app 第一阶段不要做太复杂。

核心页面:

首页
活动列表
活动详情
发布活动
搭子匹配
动态列表
动态详情
消息通知
我的
登录授权
个人资料

第一阶段优先做:

用户能看活动
用户能报名
用户能发布活动
用户能查看自己的报名
后台能审核
后台能管理

这条闭环打通,项目就有价值了。


十三、UI 设计怎么交给 AI ​

UI 我不会自己纠结太久。

我会先定一套风格:

年轻化
轻社交
旅行感
清爽
卡片式
暖色
适合小程序

然后让 AI 生成:

首页设计稿
活动卡片
活动详情
报名弹窗
我的页面
后台工作台
审核列表
数据看板

前端不需要 100% 还原设计图,先做到:

布局清晰
风格统一
操作顺畅

十四、测试方案 ​

一个人开发最容易忽略测试,但我会让 AI 帮我生成测试清单。

每个模块有三类测试:

1. 接口测试 ​

正常参数
缺少参数
非法参数
未登录
无权限
数据不存在
重复提交
状态不允许

2. 前端页面测试 ​

列表加载
搜索筛选
分页
空数据
错误提示
按钮权限
弹窗确认
表单校验

3. 业务流程测试 ​

例如活动审核:

用户发布活动
后台看到待审核活动
后台审核通过
app 活动列表展示
用户报名活动
报名人数增加
活动满员后禁止报名
活动下架后不再展示

十五、运维部署方案 ​

第一阶段我会用简单但规范的 Docker Compose。

服务包括:

Nginx
backend
MySQL
Redis
web-admin 静态资源

目录结构:

deploy
├── docker-compose.yml
├── nginx
│   ├── nginx.conf
│   └── conf.d
├── mysql
│   ├── data
│   └── initdb
├── redis
├── logs
└── scripts
    ├── deploy-backend.sh
    ├── deploy-web.sh
    └── backup-mysql.sh

访问路径 ​

web-admin:
https://admin.xxx.com

backend API:
https://api.xxx.com/api

uni-app:
请求 https://api.xxx.com/api/app/**

日志策略 ​

backend 日志挂载到宿主机
Nginx 日志挂载到宿主机
MySQL 定时备份
Redis 不保存核心业务数据
异常日志后续接入 AI 分析

十六、项目推进节奏 ​

如果是我一个人做,我会按 6 个阶段推进。

第一阶段:项目骨架和规范 ​

目标:

三个项目能启动
文档结构建立
接口规范建立
权限规范建立
部署结构建立

产出:

backend 基础工程
web-admin 基础工程
uni-app 基础工程
docs/API
docs/product
docs/deploy

第二阶段:认证与权限闭环 ​

目标:

app 用户登录
web-admin 管理员登录
JWT 鉴权
RBAC 权限
菜单权限
按钮权限

为什么先做这个?

因为后面所有接口都依赖身份和权限。


第三阶段:活动业务闭环 ​

目标:

app 发布活动
web-admin 审核活动
app 展示活动
app 报名活动
web-admin 管理报名

这是项目第一条核心业务闭环。


第四阶段:内容互动闭环 ​

目标:

用户发动态
用户评论
后台审核动态
后台处理举报
通知用户审核结果

第五阶段:运营后台增强 ​

目标:

运营配置
话题管理
推荐配置
数据统计
反馈处理
系统监控

第六阶段:部署上线和优化 ​

目标:

服务器部署
Nginx 配置
HTTPS
日志
备份
接口压测
异常修复
上线验收

十七、我会怎么安排每天的开发工作 ​

我不会每天打开 Cursor 就让它随便写。

我会这样做:

上午:梳理当天模块契约
下午:让 AI 生成代码
晚上:联调和修复
睡前:更新文档和 checklist

每个功能固定流程:

1. 写业务说明
2. 写接口契约
3. 写 mock 数据
4. 写后端接口
5. 写前端调用
6. 联调
7. 写测试结果
8. 标记接口状态

这套流程会让你越做越稳。


十八、具体到 Cursor 的工作方式 ​

我会开三个 Cursor 窗口:

Cursor Backend
Cursor Web Admin
Cursor Uni-app

但是它们不能各干各的。

它们共同读取:

docs/API
docs/product
docs/architecture

我会给每个 Cursor 一个固定规则。

Backend Cursor 规则 ​

你只能根据 docs/API 实现接口。
如果发现接口字段不合理,先修改文档,不要直接改代码。
Entity 不允许直接返回前端。
Controller 只做参数接收和响应返回。
业务逻辑放 Application Service。
权限码必须来自 docs/architecture/权限模型.md。

Web Cursor 规则 ​

你只能根据 docs/API/web-admin 和 docs/API/common 写接口。
mock 数据必须和接口文档响应结构一致。
如果页面需要新增字段,先更新接口文档。
不要随意创造后端不存在的字段。
权限 meta.permission 必须来自权限码文档。

Uni-app Cursor 规则 ​

你只能根据 docs/API/app 和 docs/API/common 写接口。
页面字段必须来自接口文档。
mock 数据必须和接口文档一致。
如果需要新增接口,先写到 docs/API/app。

十九、开发细节放最后:我的推荐技术实现 ​

后端 ​

JDK 17
Spring Boot 3.4
Spring Security
JWT
MyBatis-Plus
MySQL 8
Redis
Knife4j
MapStruct
Validation
Lombok
Docker

web-admin ​

Vue3
Vite
TypeScript
Element Plus
Pinia
Vue Router
Axios
Mock
ECharts

uni-app ​

uni-app
Vue3
TypeScript
Pinia
uView Plus / uni-ui
微信小程序
H5 兼容

文档 ​

Markdown
OpenAPI
Apifox / Apipost
Swagger / Knife4j

二十、最终我会坚持的原则 ​

如果我是这个项目负责人,我会坚持这几条:

1. 先闭环,再扩展
2. 先契约,再代码
3. 前端 mock 不决定后端模型
4. 后端 Entity 不直接暴露给前端
5. app 和 admin 接口不强行复用
6. 业务能力尽量复用
7. 权限码必须统一来源
8. 文档是项目的中枢,不是附属品
9. 每个模块必须有联调 checklist
10. AI 可以写代码,但人必须控制边界

最重要的是:

你一个人做这个项目,真正要搭建的不是某一个页面、某一个接口,而是一套能让 AI 持续稳定参与开发的工程化流程。

这才是 vibe coding 真正有价值的地方。

Powered by VitePress