
本篇目标:学会从0开始设计一个小程序的整体架构,理解"为什么这样设计"比"怎么写代码"更重要
学完这一篇,你将掌握:
在动手写代码前,先想清楚:我们要做一个什么样的ChatGPT小程序?
核心功能:
用户使用流程:

从用户流程可以看出,我们至少需要:
🤔 思考题:为什么不把认证和聊天放在一个页面?
点击查看答案
分离的好处:
想象你要建一栋房子,你会:
小程序架构也是一样:

举个例子:聊天气泡在多个地方都会用到
ChatBubble组件,到处复用分层的好处:
基于以上思考,我们设计这样的目录结构:

💡 设计原则:
这个文件就像小程序的身份证,定义了:
{
"name": "chatgpt-miniprogram",
"appid": "__UNI__XXXXXX",
"description": "仿ChatGPT的AI聊天小程序",
"mp-weixin": {
"appid": "你的小程序AppID",
"setting": {
"urlCheck": false // 关键:允许调用本地API
}
}
}🔧 重点配置解释:
urlCheck: false:开发时允许调用localhost接口appid:微信小程序的唯一标识这个文件管理所有页面:
{
"pages": [
{ "path": "pages/index/index" },
{ "path": "pages/auth/auth" },
{ "path": "pages/chat/chat" }
],
"globalStyle": {
"navigationBarTitleText": "ChatGPT小程序",
"backgroundColor": "#f8f9fa"
}
}设计思路:
UniApp支持Vue2和Vue3,我们选择Vue2(更稳定):
import App from './App'
import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()为什么选择Vue2:
我们设计这样的用户体验:
1. 启动页 (2秒)
↓
2. 检查是否已认证
├─ 是 → 直接进入聊天页
└─ 否 → 跳转认证页
↓
3. 认证页面
├─ 输入Access Key
├─ 验证成功 → 保存信息 → 进入聊天页
└─ 验证失败 → 提示重新输入
↓
4. 聊天页面
├─ 发送消息
├─ 接收回复
└─ 管理对话历史认证成功后跳转:
// 认证成功
if (result.valid) {
// 保存认证信息
uni.setStorageSync('accessKey', accessKey)
// 跳转到聊天页
uni.reLaunch({
url: '/pages/chat/chat'
})
}关键API说明:
uni.setStorageSync():本地存储,下次打开还在uni.reLaunch():清空页面栈,相当于重新开始有时候需要在页面间传递数据:
// 方式1:URL参数(简单数据)
uni.navigateTo({
url: '/pages/chat/chat?from=auth&userId=123'
})
// 方式2:本地存储(复杂数据)
uni.setStorageSync('userInfo', userInfo)🤔 思考题:什么时候用URL参数,什么时候用本地存储?
点击查看答案
想象一下:
用户会觉得这是个"山寨"应用。
我们在styles/variables.scss中定义:
// 主色系
$primary-color: #007aff; // 主品牌色
$success-color: #34c759; // 成功绿
$warning-color: #ff9500; // 警告橙
$error-color: #ff3b30; // 错误红
// 文字色彩
$text-primary: #000000; // 主要文字
$text-secondary: #666666; // 次要文字
$text-disabled: #cccccc; // 禁用文字
// 背景色彩
$bg-primary: #ffffff; // 主背景
$bg-secondary: #f5f5f5; // 次背景使用方式:
.chat-button {
background-color: $primary-color; // 统一使用变量
color: $text-primary;
}// 间距系统(8的倍数原则)
$spacing-xs: 8rpx; // 极小间距
$spacing-sm: 16rpx; // 小间距
$spacing-md: 24rpx; // 中等间距
$spacing-lg: 32rpx; // 大间距
// 字体大小
$font-size-sm: 24rpx; // 小字
$font-size-base: 28rpx; // 正文
$font-size-lg: 32rpx; // 标题💡 为什么用8的倍数:
启动页要解决什么问题?
<template>
<view class="splash-page">
<view class="logo-section">
<text class="app-title">ChatGPT助手</text>
<text class="app-subtitle">智能对话,即刻开始</text>
</view>
<view class="loading-section">
<view class="loading-dots">
<view class="dot"></view>
<view class="dot"></view>
<view class="dot"></view>
</view>
</view>
</view>
</template>
<script>
export default {
onLoad() {
// 2秒后自动跳转
setTimeout(() => {
this.checkAuthAndRedirect()
}, 2000)
},
methods: {
checkAuthAndRedirect() {
const accessKey = uni.getStorageSync('accessKey')
if (accessKey) {
// 已认证,直接进入聊天
uni.reLaunch({ url: '/pages/chat/chat' })
} else {
// 未认证,去认证页
uni.reLaunch({ url: '/pages/auth/auth' })
}
}
}
}
</script>代码要点解释:
onLoad():页面加载时执行setTimeout():延迟2秒,给用户品牌印象时间uni.getStorageSync():检查是否已保存Access Keyuni.reLaunch():清空页面栈重新开始.splash-page {
height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.app-title {
font-size: $font-size-xxl; // 使用设计变量
color: $text-inverse; // 使用设计变量
font-weight: bold;
text-align: center;
}设计思路:
1. 善用控制台:
console.log('用户信息:', userInfo) // 查看数据
console.error('API调用失败:', error) // 查看错误2. 微信开发者工具的调试功能:
3. 真机调试:
// 开发环境 vs 生产环境
const API_BASE = process.env.NODE_ENV === 'development'
? 'http://localhost:7714' // 本地开发
: 'https://api.yourdomain.com' // 线上环境问题1:页面空白
pages.json是否正确配置问题2:API调用失败
manifest.json中的urlCheck设置manifest.json:应用基本信息pages.json:页面路由管理 main.js:应用入口配置💡 记住:好的架构不是一开始就完美的,而是在不断实践中逐步优化的。现在你已经有了一个坚实的基础,后面的功能开发会越来越顺手!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。