← 回到列表
用 AI 从 0 开发 PHP7.4 + UniApp + MySQL5.7 项目指南
这一页
用 AI 从 0 开发 PHP7.4 + UniApp + MySQL5.7 项目指南
以 PHP 7.4 + UniApp + MySQL 5.7 为技术栈(目标每分钟约 100 次访问),覆盖需求、架构、数据库设计、前后端开发到部署上线全流程,并标注每环节如何用 AI 提效。
一、项目定位与技术选型
1.1 项目基本盘
| 项目维度 | 信息 |
|---|---|
| 后端语言 | PHP 7.4 |
| 前端框架 | UniApp(Vue 2 语法,一套代码多端运行) |
| 数据库 | MySQL 5.7 |
| Web 服务器 | Nginx + PHP-FPM |
| 目标终端 | 微信小程序 / H5 / App(UniApp 编译) |
| 预计访问量 | 每分钟约 100 次(约 1.7 QPS) |
| 缓存 | Redis 6.x(可选但推荐) |
1.2 为什么选这套技术栈
| 决策点 | 选择 | 理由 |
|---|---|---|
| 后端用 PHP 7.4 | PHP 7.4 | 性能比 5.x 提升约 2 倍,类型声明更完善,生态成熟,部署简单 |
| 前端用 UniApp | UniApp | 一套代码出小程序 + H5 + App,降低开发和维护成本 |
| 数据库用 MySQL 5.7 | MySQL 5.7 | JSON 字段支持、生成列、性能优化,足够应对当前量级 |
| 加 Redis | Redis | 缓存热点数据、Session 共享、限流,应对未来增长 |
1.3 访问量评估
每分钟 100 次访问 ≈ 每秒 1.7 QPS这个量级的特点:- 单机完全扛得住,不需要分布式架构- 瓶颈通常在数据库查询和外部 API 调用,而非 Web 服务器- 重点优化:索引、缓存、连接池,而非横向扩展- 预留 10 倍余量 → 目标支撑 1000 QPS(为增长留空间)1.4 AI 在项目中的角色定位
| 误区 | 正确认知 |
|---|---|
| AI 全自动写完整个项目 | AI 是结对开发的助手,逐模块迭代 |
| 一次描述所有需求 | 拆成小任务,每个任务聚焦一个功能 |
| AI 代码直接上线 | 每行代码需人工审查,尤其是安全逻辑 |
| AI 能记住所有细节 | 核心约定用文档固化,每次喂给 AI |
二、项目架构设计
2.1 整体架构
┌─────────────────────────────────────────────────────┐│ 客户端层 ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │ 微信小程序 │ │ H5 │ │ App │ ││ └─────┬────┘ └────┬─────┘ └────┬─────┘ ││ │ │ │ ││ └────────────┼─────────────┘ ││ ▼ ││ UniApp 统一前端 │└─────────────────────┬───────────────────────────────┘ │ HTTPS ▼┌─────────────────────────────────────────────────────┐│ Nginx (80/443) ││ 反向代理 + 静态资源 + 负载均衡 │└─────────────────────┬───────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────┐│ PHP-FPM (PHP 7.4) ││ ┌─────────────────────────┐ ││ │ 业务逻辑层(MVC) │ ││ │ Controller → Service → Model ││ └─────────────────────────┘ │└──────┬──────────────┬───────────────────────────────┘ │ │ ▼ ▼┌──────────┐ ┌──────────────┐│ Redis │ │ MySQL 5.7 ││ 缓存层 │ │ 数据持久层 │└──────────┘ └──────────────┘2.2 后端目录结构
project/├── app/ # 应用核心│ ├── controller/ # 控制器│ │ ├── api/ # API 接口│ │ └── admin/ # 后台接口│ ├── service/ # 业务逻辑层│ ├── model/ # 数据模型层│ ├── middleware/ # 中间件(鉴权、限流、日志)│ └── common/ # 公共函数├── config/ # 配置文件│ ├── database.php│ ├── redis.php│ └── app.php├── route/ # 路由定义├── runtime/ # 运行时日志/缓存├── public/ # Web 根目录│ └── index.php # 入口文件├── docs/ # 项目文档(给 AI 看的上下文)│ ├── api.md # API 文档│ ├── database.md # 数据库设计文档│ └── convention.md # 项目开发规范└── vendor/ # Composer 依赖2.3 UniApp 前端目录结构
uniapp-project/├── pages/ # 页面│ ├── index/ # 首页│ ├── user/ # 用户中心│ ├── order/ # 订单│ └── login/ # 登录├── components/ # 公共组件├── api/ # 接口请求封装│ ├── request.js # 请求拦截器│ └── modules/ # 按模块拆分├── store/ # Vuex 状态管理├── utils/ # 工具函数├── static/ # 静态资源├── pages.json # 页面路由配置├── manifest.json # 应用配置└── App.vue # 根组件三、环境搭建
3.1 开发环境
| 工具 | 说明 |
|---|---|
| phpStudy / Laragon | Windows 本地集成环境(PHP + Nginx + MySQL) |
| PhpStorm | PHP 后端 IDE |
| HBuilderX | UniApp 官方 IDE(必装) |
| Navicat | MySQL 可视化管理 |
| Redis Desktop Manager | Redis 可视化管理 |
| Postman / Apifox | API 调试 |
3.2 PHP 7.4 环境配置要点
; php.ini 关键配置memory_limit = 256Mmax_execution_time = 30upload_max_filesize = 20Mpost_max_size = 20M; OPcache(生产环境必开)opcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=10000opcache.revalidate_freq=603.3 MySQL 5.7 关键配置
# my.cnf 关键配置[mysqld]# 字符集character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci# 连接数(100 QPS 量级足够)max_connections = 200max_user_connections = 150# InnoDB 配置innodb_buffer_pool_size = 512M # 服务器内存的 50-70%innodb_log_file_size = 128Minnodb_flush_log_at_trx_commit = 2 # 性能与安全平衡# 慢查询日志slow_query_log = 1slow_query_log_file = /var/log/mysql/slow.loglong_query_time = 13.4 Nginx 配置
server { listen 80; server_name api.example.com; root /var/www/project/public; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; break; } } location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 30d; add_header Cache-Control "public, no-transform"; }}3.5 用 AI 生成环境配置
提示词示例:
我需要在 CentOS 7 上部署 PHP 7.4 + Nginx + MySQL 5.7 + Redis 的环境。请帮我生成:1. 一键安装的 shell 脚本2. 各软件的配置文件(针对每分钟 100 次访问的小型项目优化)3. 防火墙规则(只开放 80、443、22 端口)注意:MySQL 密码请用变量占位符,不要硬编码。四、数据库设计
4.1 设计原则
- 所有表用 InnoDB 引擎、utf8mb4 字符集
- 每张表必须有自增主键
id - 时间字段统一用
create_time/update_time(int 类型存时间戳) - 软删除用
delete_time字段(null 表示未删除) - 金额字段用
decimal(10,2),不用 float - 状态字段用
tinyint,并在注释中标明各值含义
4.2 核心表设计示例
-- 用户表CREATE TABLE `user` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `openid` varchar(64) DEFAULT NULL COMMENT '微信openid', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `nickname` varchar(50) DEFAULT NULL COMMENT '昵称', `avatar` varchar(255) DEFAULT NULL COMMENT '头像', `status` tinyint NOT NULL DEFAULT '1' COMMENT '1正常 0禁用', `create_time` int NOT NULL COMMENT '创建时间', `update_time` int NOT NULL COMMENT '更新时间', `delete_time` int DEFAULT NULL COMMENT '删除时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_openid` (`openid`), KEY `idx_phone` (`phone`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';-- 商品/内容表(根据项目调整)CREATE TABLE `product` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL COMMENT '标题', `description` text COMMENT '描述', `price` decimal(10,2) NOT NULL COMMENT '价格', `stock` int NOT NULL DEFAULT '0' COMMENT '库存', `cover_image` varchar(255) DEFAULT NULL COMMENT '封面图', `images` json DEFAULT NULL COMMENT '图片组', `status` tinyint NOT NULL DEFAULT '1' COMMENT '1上架 0下架', `sort` int NOT NULL DEFAULT '0' COMMENT '排序', `create_time` int NOT NULL, `update_time` int NOT NULL, `delete_time` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_status_sort` (`status`, `sort`), KEY `idx_create_time` (`create_time`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';-- 订单表CREATE TABLE `order` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `order_no` varchar(32) NOT NULL COMMENT '订单号', `user_id` int NOT NULL COMMENT '用户ID', `product_id` int NOT NULL COMMENT '商品ID', `amount` decimal(10,2) NOT NULL COMMENT '订单金额', `status` tinyint NOT NULL DEFAULT '0' COMMENT '0待支付 1已支付 2已发货 3已完成 4已取消', `pay_time` int DEFAULT NULL COMMENT '支付时间', `create_time` int NOT NULL, `update_time` int NOT NULL, `delete_time` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_order_no` (`order_no`), KEY `idx_user_id` (`user_id`), KEY `idx_status` (`status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';4.3 索引设计要点
| 场景 | 索引策略 |
|---|---|
| 列表查询 | WHERE status=1 ORDER BY sort, create_time → 联合索引 (status, sort, create_time) |
| 用户维度查询 | WHERE user_id=? ORDER BY create_time DESC → 索引 (user_id, create_time) |
| 搜索功能 | 短关键词用 LIKE 前缀匹配 + 索引;长文搜索考虑全文索引或 Elasticsearch |
| 避免索引失效 | 不在索引列做运算、函数操作,不用 !=、NOT LIKE |
4.4 用 AI 辅助数据库设计
提示词示例:
我要开发一个 [项目类型] 系统,技术栈 PHP 7.4 + MySQL 5.7。核心功能包括:[功能1]、[功能2]、[功能3]。请帮我:1. 设计完整的数据库表结构(包括字段、类型、索引、注释)2. 标注表与表之间的关联关系3. 给出建表 SQL(MySQL 5.7 语法,InnoDB 引擎,utf8mb4)4. 说明每个索引的设计理由约束:- 预计数据量:用户 10 万,订单 100 万- 查询场景:列表分页、用户维度查询、关键词搜索五、后端 API 开发
5.1 API 设计规范
基础路径:/api/v1/RESTful 风格:GET /api/v1/products # 商品列表GET /api/v1/products/:id # 商品详情POST /api/v1/orders # 创建订单GET /api/v1/orders # 订单列表PUT /api/v1/orders/:id/cancel # 取消订单POST /api/v1/users/login # 登录5.2 统一响应格式
<?php// 成功{ "code": 0, "msg": "success", "data": { "id": 1, "title": "商品名称" }}// 失败{ "code": 1001, "msg": "参数错误", "data": null}// 分页{ "code": 0, "msg": "success", "data": { "list": [...], "total": 100, "page": 1, "page_size": 20 }}5.3 分层架构代码示例
<?php// Controller 层 - 只做参数接收和响应输出class OrderController{ public function create() { $data = [ 'user_id' => $this->getUserId(), 'product_id' => (int)input('post.product_id'), 'quantity' => (int)input('post.quantity', 1), ]; try { $orderService = new OrderService(); $orderNo = $orderService->createOrder($data); return json(['code' => 0, 'msg' => '下单成功', 'data' => ['order_no' => $orderNo]]); } catch (BusinessException $e) { return json(['code' => $e->getCode(), 'msg' => $e->getMessage(), 'data' => null]); } }}// Service 层 - 核心业务逻辑class OrderService{ public function createOrder(array $data): string { // 1. 校验商品 $product = (new ProductModel())->findById($data['product_id']); if (!$product || $product['status'] != 1) { throw new BusinessException(2001, '商品不存在或已下架'); } // 2. 检查库存(用 Redis 防超卖) $redis = Redis::getInstance(); $stockKey = "product:stock:{$data['product_id']}"; $remain = $redis->hIncrBy($stockKey, 'stock', -$data['quantity']); if ($remain < 0) { $redis->hIncrBy($stockKey, 'stock', $data['quantity']); // 回滚 throw new BusinessException(2002, '库存不足'); } // 3. 创建订单(数据库事务) Db::startTrans(); try { $orderNo = generateOrderNo(); $orderData = [ 'order_no' => $orderNo, 'user_id' => $data['user_id'], 'product_id' => $data['product_id'], 'amount' => bcmul($product['price'], $data['quantity'], 2), 'status' => 0, 'create_time'=> time(), 'update_time'=> time(), ]; Db::table('order')->insert($orderData); // 扣减数据库库存 Db::table('product') ->where('id', $data['product_id']) ->where('stock', '>=', $data['quantity']) ->dec('stock', $data['quantity']) ->update(); Db::commit(); return $orderNo; } catch (\Exception $e) { Db::rollback(); $redis->hIncrBy($stockKey, 'stock', $data['quantity']); // 回滚 Redis throw new BusinessException(2003, '下单失败,请重试'); } }}// Model 层 - 数据访问class ProductModel{ public function findById(int $id): ?array { // 先查 Redis 缓存 $cacheKey = "product:detail:{$id}"; $redis = Redis::getInstance(); $cached = $redis->get($cacheKey); if ($cached) { return json_decode($cached, true); } // 查数据库 $data = Db::table('product') ->where('id', $id) ->where('delete_time', null) ->find(); if ($data) { $redis->setex($cacheKey, 3600, json_encode($data)); } return $data; }}5.4 用 AI 生成后端代码
提示词示例:
我在开发一个 PHP 7.4 后端项目,不使用框架,自定义 MVC 路由。现在需要实现 [功能名称,如:用户注册登录] 功能。已有约定:- 数据库表结构:[粘贴表结构]- 响应格式:{"code":0,"msg":"","data":{}}- 密码加密:password_hash() / password_verify()- Token 用 JWT请生成:1. Controller 层代码(参数校验 + 调用 Service)2. Service 层代码(业务逻辑)3. Model 层代码(数据库操作)4. 路由配置注意:- 参数校验必须严格- SQL 必须用预处理防注入- 密码不能明文存储- 敏感字段不在响应中返回六、UniApp 前端开发
6.1 请求封装
// api/request.jsconst BASE_URL = 'https://api.example.com/api/v1'export function request(options) { return new Promise((resolve, reject) => { const token = uni.getStorageSync('token') uni.request({ url: BASE_URL + options.url, method: options.method || 'GET', data: options.data || {}, header: { 'Content-Type': 'application/json', 'Authorization': token ? `Bearer ${token}` : '' }, success: (res) => { if (res.data.code === 0) { resolve(res.data.data) } else if (res.data.code === 4001) { // token 失效,跳转登录 uni.removeStorageSync('token') uni.navigateTo({ url: '/pages/login/login' }) reject(res.data) } else { uni.showToast({ title: res.data.msg, icon: 'none' }) reject(res.data) } }, fail: (err) => { uni.showToast({ title: '网络异常', icon: 'none' }) reject(err) } }) })}6.2 按模块封装 API
// api/modules/product.jsimport { request } from '../request.js'// 商品列表export function getProductList(params) { return request({ url: '/products', method: 'GET', data: params })}// 商品详情export function getProductDetail(id) { return request({ url: `/products/${id}`, method: 'GET' })}6.3 页面开发示例
<!-- pages/index/index.vue --><template> <view class="container"> <!-- 搜索栏 --> <view class="search-bar"> <input v-model="keyword" placeholder="搜索商品" @confirm="onSearch" /> </view> <!-- 商品列表 --> <view class="product-list"> <view v-for="item in list" :key="item.id" class="product-item" @tap="goDetail(item.id)" > <image :src="item.cover_image" mode="aspectFill" class="cover" /> <view class="info"> <text class="title">{{ item.title }}</text> <text class="price">¥{{ item.price }}</text> </view> </view> </view> <!-- 加载状态 --> <view class="loading" v-if="loading">加载中...</view> <view class="no-more" v-if="!hasMore && list.length > 0">没有更多了</view> </view></template><script>import { getProductList } from '@/api/modules/product.js'export default { data() { return { keyword: '', list: [], page: 1, pageSize: 20, hasMore: true, loading: false } }, onLoad() { this.loadList() }, onReachBottom() { // 触底加载更多 if (this.hasMore && !this.loading) { this.loadList() } }, methods: { async loadList() { if (this.loading) return this.loading = true try { const data = await getProductList({ keyword: this.keyword, page: this.page, page_size: this.pageSize }) this.list = this.page === 1 ? data.list : [...this.list, ...data.list] this.hasMore = data.list.length >= this.pageSize if (this.hasMore) this.page++ } finally { this.loading = false } }, onSearch() { this.page = 1 this.list = [] this.hasMore = true this.loadList() }, goDetail(id) { uni.navigateTo({ url: `/pages/detail/detail?id=${id}` }) } }}</script>6.4 用 AI 生成前端代码
提示词示例:
我在用 UniApp(Vue 2 语法)开发一个 [页面名称] 页面。请帮我生成完整代码,包括 template、script、style 三部分。页面需求:1. [功能描述,如:展示商品列表,支持下拉刷新和触底加载更多]2. [交互描述,如:点击跳转详情页]技术约定:- API 请求用已封装的 request 方法- 样式用 rpx 单位- 列表用 v-for 渲染- 图片用 <image> 标签,mode="aspectFill"接口返回格式:{ "list": [{ "id": 1, "title": "xx", "price": "99.00", "cover_image": "url" }], "total": 100, "page": 1, "page_size": 20}七、性能优化(每分钟 100 次访问量级)
7.1 优化策略总览
当前量级(1.7 QPS)的优化重点:┌──────────────────────────────────────────────┐│ 1. 数据库索引优化 ← 最高优先级 ││ 2. Redis 缓存热点数据 ← 立竿见影 ││ 3. 接口分页 + 按需返回 ← 减少传输量 ││ 4. OPcache 开启 ← PHP 性能翻倍 ││ 5. 静态资源 CDN ← 减轻服务器压力 │└──────────────────────────────────────────────┘不需要做的(过度设计):✗ 微服务化✗ 分库分表✗ 消息队列✗ 多机负载均衡(单机足够)7.2 数据库优化
-- 1. 慢查询排查-- 开启慢查询日志,long_query_time = 1s-- 用 EXPLAIN 分析慢查询执行计划-- 2. 列表查询优化(避免深分页)-- ❌ 慢:深分页会扫描大量行SELECT * FROM product ORDER BY id LIMIT 100000, 20;-- ✅ 快:用游标分页(记住上一页最后一条 id)SELECT * FROM product WHERE id > 100000 ORDER BY id LIMIT 20;-- 3. 避免 SELECT *,只查需要的字段-- ❌ 慢SELECT * FROM product WHERE status = 1;-- ✅ 快SELECT id, title, price, cover_image FROM product WHERE status = 1;7.3 Redis 缓存策略
<?php// 缓存策略模式// 1. 详情页缓存(Cache-Aside)function getProductDetail($id) { $cacheKey = "product:detail:{$id}"; $data = $redis->get($cacheKey); if ($data) return json_decode($data, true); $data = Db::table('product')->where('id', $id)->find(); if ($data) { $redis->setex($cacheKey, 3600, json_encode($data)); // 缓存1小时 } return $data;}// 2. 列表缓存(带页码)function getProductList($page, $pageSize) { $cacheKey = "product:list:{$page}:{$pageSize}"; $data = $redis->get($cacheKey); if ($data) return json_decode($data, true); $data = Db::table('product') ->where('status', 1) ->order('sort', 'desc') ->page($page, $pageSize) ->select(); $redis->setex($cacheKey, 300, json_encode($data)); // 缓存5分钟 return $data;}// 3. 缓存更新(写入时清除)function updateProduct($id, $data) { Db::table('product')->where('id', $id)->update($data); $redis->del("product:detail:{$id}"); // 清详情缓存 $redis->del("product:list:*"); // 清列表缓存(用 keys 扫描或维护 key 集合)}7.4 接口优化
| 优化点 | 做法 | 效果 |
|---|---|---|
| 分页 | 每页 20 条,用游标分页避免深分页 | 减少 DB 扫描 |
| 字段精简 | 列表接口只返回必要字段 | 减少传输和内存 |
| 批量接口 | 多个简单查询合并为一个接口 | 减少请求次数 |
| 图片懒加载 | UniApp 用 lazy-load 属性 |
减少首屏加载时间 |
| Gzip 压缩 | Nginx 开启 gzip on |
减少传输体积 |
7.5 Nginx 性能配置
# gzip 压缩gzip on;gzip_min_length 1k;gzip_comp_level 6;gzip_types text/plain application/json application/javascript text/css;# 客户端缓存location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico)$ { expires 30d; add_header Cache-Control "public, immutable";}# PHP-FPM 调优(每分钟 100 次访问)# php-fpm.confpm = dynamicpm.max_children = 20 # 每个进程约 30MB,20 个 = 600MBpm.start_servers = 5pm.min_spare_servers = 2pm.max_spare_servers = 8八、安全设计
8.1 安全清单
| 安全项 | 措施 |
|---|---|
| SQL 注入 | 全部用预处理语句(PDO / 查询构造器) |
| XSS | 输出时转义 htmlspecialchars(),前端用 v-text 而非 v-html |
| CSRF | Token 校验 + SameSite Cookie |
| 越权访问 | 每个接口校验当前用户是否有权操作该资源 |
| 文件上传 | 校验 MIME 类型 + 重命名 + 存储到非 Web 目录 |
| 接口防刷 | Redis 限流(如每用户每分钟最多 60 次请求) |
| 敏感数据 | 密码 password_hash(),手机号脱敏显示,配置文件不提交 Git |
| HTTPS | 全站 HTTPS,Let's Encrypt 免费证书 |
8.2 接口限流示例
<?php// 基于 Redis 的滑动窗口限流function rateLimit($userId, $maxRequests = 60, $window = 60) { $redis = Redis::getInstance(); $key = "rate_limit:{$userId}"; // 当前时间戳(毫秒) $now = microtime(true) * 1000; $windowStart = $now - $window * 1000; // 移除窗口外的记录 $redis->zRemRangeByScore($key, 0, $windowStart); // 当前窗口内请求数 $count = $redis->zCard($key); if ($count >= $maxRequests) { throw new BusinessException(4290, '请求过于频繁,请稍后再试'); } // 记录本次请求 $redis->zAdd($key, $now, $now . '_' . uniqid()); $redis->expire($key, $window);}九、部署上线
9.1 服务器配置建议
| 配置项 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核 |
| 内存 | 4 GB | 8 GB |
| 磁盘 | 50 GB SSD | 100 GB SSD |
| 带宽 | 5 Mbps | 10 Mbps |
| 系统 | CentOS 7 / Ubuntu 20.04 | Ubuntu 22.04 |
9.2 部署流程
1. 服务器初始化 ├── 创建非 root 用户 ├── 配置 SSH 密钥登录 ├── 关闭密码登录 └── 配置防火墙(ufw / firewalld)2. 安装运行环境 ├── PHP 7.4 + FPM + OPcache ├── Nginx ├── MySQL 5.7 ├── Redis 6 └── Composer3. 部署代码 ├── Git clone 代码到 /var/www/project ├── composer install --no-dev ├── 导入数据库 SQL ├── 配置 .env(数据库密码、Redis 密码、JWT 密钥) └── 设置目录权限(runtime 目录可写)4. 配置 Nginx ├── 配置站点 ├── 配置 HTTPS(Let's Encrypt) └── 配置反向代理 PHP-FPM5. 部署 UniApp ├── HBuilderX 编译各端 ├── 小程序:上传到微信开发者工具 → 提交审核 ├── H5:编译后上传到 Nginx 静态目录 └── App:打包 apk/ipa 上架9.3 用 AI 生成部署脚本
提示词示例:
请帮我生成一个 CentOS 7 的一键部署 Shell 脚本,需要:1. 安装 PHP 7.4 + Nginx + MySQL 5.7 + Redis 62. 创建项目目录 /var/www/project3. 配置 PHP-FPM(pm.max_children=20)4. 配置 MySQL(root 密码用变量,创建项目数据库和用户)5. 配置 Nginx 站点(域名用变量,反向代理 PHP-FPM)6. 开启防火墙 80/443/22 端口要求:- 脚本可重复执行不出错(幂等)- 敏感信息用环境变量传入- 每步输出日志十、AI 开发全流程提示词速查
10.1 需求阶段
你是一位资深产品经理。我想用 PHP 7.4 + UniApp + MySQL 5.7 开发一个 [项目类型]。目标用户:[描述]核心功能:[列举]请输出:1. 用户角色和需求清单2. MVP 功能优先级表(P0/P1/P2)3. 数据库表设计(含字段、索引)4. API 接口清单10.2 数据库阶段
基于以下需求,设计 MySQL 5.7 数据库:[粘贴需求]要求:- InnoDB 引擎,utf8mb4 字符集- 预计数据量:[描述]- 给出建表 SQL + 索引设计理由- 考虑未来扩展(预留字段或 JSON 字段)10.3 后端开发阶段
用 PHP 7.4 实现 [功能名称] 接口。已有表结构:[粘贴]已有公共函数:[说明]要求:- Controller / Service / Model 三层分离- 参数校验、权限校验、错误处理- 用预处理防 SQL 注入- 生成完整可运行代码 + 注释10.4 前端开发阶段
用 UniApp(Vue 2)实现 [页面名称] 页面。接口返回:[粘贴格式]UI 参考:[描述或截图]要求:- template + script + style 完整代码- 支持下拉刷新、触底加载- 响应式布局,rpx 单位- 空状态、加载状态处理10.5 调试排错阶段
我遇到以下问题:现象:[描述]相关代码:[粘贴]报错信息:[粘贴]环境:PHP 7.4 + MySQL 5.7 + UniApp请分析:1. 可能的原因(按可能性排序)2. 每个原因的排查方法3. 修复代码10.6 优化阶段
我的项目当前每分钟约 100 次访问,想为未来 10 倍增长做准备。当前架构:PHP 7.4 + MySQL 5.7 + Redis + Nginx慢查询日志:[粘贴]瓶颈分析:[描述]请给出:1. 优化优先级排序(ROI 从高到低)2. 每项优化的具体方案和代码3. 优化前后的性能对比预估十一、项目开发节奏建议
11.1 MVP 开发周期(参考)
| 阶段 | 周期 | 核心任务 | AI 辅助 |
|---|---|---|---|
| 需求 + 设计 | 1 周 | 需求文档、数据库设计、API 设计 | AI 生成设计文档 |
| 环境搭建 | 2 天 | 开发/测试环境、Git 仓库 | AI 生成部署脚本 |
| 后端核心 API | 1-2 周 | 用户、商品、订单核心接口 | AI 生成 CRUD 代码 |
| 前端核心页面 | 1-2 周 | 首页、列表、详情、订单、登录 | AI 生成页面代码 |
| 联调 + 修 Bug | 1 周 | 前后端联调、边界测试 | AI 辅助排错 |
| 上线部署 | 2 天 | 服务器部署、域名、HTTPS | AI 生成运维脚本 |
11.2 每日 AI 协作流程
morning:规划 ├── 回顾昨天的进度 ├── 确定今天要做的 3 个任务 └── 把任务拆成 AI 能理解的粒度 working:执行 ├── 每个任务先写提示词,让 AI 生成代码 ├── 审查 AI 代码:逻辑、安全、边界 ├── 本地测试通过后提交 Git └── 记录 AI 表现不好的地方,优化提示词 evening:总结 ├── 更新项目文档(给 AI 用的上下文) ├── 记录踩坑日志 └── 规划明天任务十二、常见踩坑与解决方案
| 坑 | 现象 | 解决方案 |
|---|---|---|
| UniApp 跨端样式不兼容 | 小程序正常,H5 错位 | 用条件编译 #ifdef + rpx 单位 |
| PHP 时区错误 | 时间差 8 小时 | date_default_timezone_set('PRC') |
| MySQL emoji 存储失败 | 写入报错 | 确认表和连接都是 utf8mb4 |
| 微信支付回调失败 | 收不到回调 | Nginx 配置 HTTPS,回调地址不带端口号 |
| Redis 连接耗尽 | 接口超时 | 用连接池或及时 close(),调大 maxclients |
| UniApp 包体积超限 | 小程序上传失败 | 分包加载,图片压缩,移除无用依赖 |
| AI 生成的代码有硬编码 | 安全隐患 | 审查时全局搜索密码、密钥、API Key |
| AI 用了 PHP 8 语法 | 运行报错 | 提示词明确指定 PHP 7.4,检查 match、命名参数等 |
本文档覆盖 PHP 7.4 + UniApp + MySQL 5.7 技术栈的 AI 辅助开发全流程,适用于每分钟约 100 次访问量级的项目。核心原则:AI 提速、人工把关、文档固话、小步迭代。