目录
1. 前言与学习准备
1.1 本指南适合谁
这份指南专门为以下人群编写:
- Java初级开发者:已经掌握Java基础,想要学习微信开发的同学
- 传统Web开发者:想要转型做微信生态开发的程序员
- 在校学生:计算机相关专业,想要做毕业设计或者增加项目经验
- 创业者:想要快速搭建微信小程序或公众号的技术创业者
如果你是完全的编程新手,建议先学习Java基础和Spring Boot基础后再来学习本指南。
1.2 你将学到什么
通过本指南的学习,你将掌握:
- 微信开发全流程:从账号注册到项目上线的完整流程
- Spring Boot实战:在实际项目中深入理解Spring Boot的使用
- 小程序后端开发:登录认证、数据管理、支付等核心功能
- 公众号后端开发:消息处理、菜单管理、网页授权等功能
- 项目架构设计:学会设计清晰、可扩展的项目结构
- 最佳实践:掌握微信开发中的各种最佳实践和避坑指南
1.3 前置知识要求
为了更好地学习本指南,你需要具备以下基础知识:
- Java基础:理解面向对象编程、集合、异常处理等概念
- Spring Boot基础:了解Spring Boot的基本使用,如创建项目、编写Controller等
- 数据库基础:了解MySQL的基本使用,会写简单的SQL语句
- HTTP协议:理解GET、POST等请求方法,了解请求和响应的概念
- JSON格式:了解JSON数据格式,知道如何解析和生成JSON
如果某些知识点不太熟悉也不用担心,我会在使用时详细解释。
1.4 开发环境准备
在开始之前,请确保你的电脑上安装了以下软件:
1.4.1 必需软件
-
JDK 8或以上版本
- 下载地址:https://www.oracle.com/java/technologies/downloads/
- 安装后在命令行输入
java -version
检查是否安装成功
-
IntelliJ IDEA(推荐)或 Eclipse
- IDEA下载地址:https://www.jetbrains.com/idea/download/
- 社区版免费,功能已经足够使用
-
MySQL 5.7或8.0
- 下载地址:https://dev.mysql.com/downloads/mysql/
- 记住你设置的root密码,后面会用到
-
Redis(可选但推荐)
- Windows版本:https://github.com/microsoftarchive/redis/releases
- Mac可以用Homebrew安装:
brew install redis
-
Postman(API测试工具)
- 下载地址:https://www.postman.com/downloads/
1.4.2 开发工具配置
-
配置IDEA
- 安装Lombok插件:File → Settings → Plugins → 搜索Lombok → Install
- 配置Maven:File → Settings → Build → Build Tools → Maven
- 设置编码:File → Settings → Editor → File Encodings → 都设置为UTF-8
-
配置Maven镜像(加速依赖下载)
找到Maven的settings.xml文件(通常在用户目录/.m2/下),添加阿里云镜像:
<mirrors> <mirror> <id>aliyun-maven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors>
2. 微信开发基础概念
在正式开始编码之前,我们需要先理解微信开发的一些基础概念。这些概念非常重要,理解了它们,后面的开发就会事半功倍。
2.1 微信生态系统介绍
微信不仅仅是一个聊天工具,它已经发展成为一个完整的生态系统:
- 微信聊天:最基础的即时通讯功能
- 微信公众号:包括订阅号、服务号和企业号
- 微信小程序:无需下载安装的轻应用
- 微信支付:移动支付解决方案
- 企业微信:企业内部沟通协作工具
作为开发者,我们主要关注的是公众号和小程序的开发。
2.2 小程序vs公众号:区别与联系
很多初学者分不清小程序和公众号的区别,让我用通俗的语言解释一下:
2.2.1 微信公众号
什么是公众号?
- 可以理解为微信里的"网站"或"博客"
- 用户需要关注才能接收消息
- 主要用于信息发布和用户互动
公众号的类型:
- 订阅号:适合个人和媒体,每天可以发送1条消息
- 服务号:适合企业,每月可以发送4条消息,功能更强大
- 企业号:现已升级为企业微信
公众号能做什么?
- 发送图文消息、语音、视频等
- 自定义菜单,提供各种服务
- 网页授权,获取用户信息
- 微信支付,实现交易功能
2.2.2 微信小程序
什么是小程序?
- 可以理解为微信里的"APP"
- 无需下载安装,即用即走
- 有独立的开发框架和语法
小程序的特点:
- 体验好:加载速度快,操作流畅
- 获取成本低:扫码或搜索即可使用
- 功能丰富:可以调用微信的各种能力
小程序能做什么?
- 电商购物、点餐、打车等各种服务
- 游戏、工具类应用
- 线下门店的连接器
2.2.3 如何选择?
- 如果你主要是发布内容,选择公众号
- 如果你要提供功能服务,选择小程序
- 很多企业是两者结合使用
2.3 微信开发的核心概念
2.3.1 AppID和AppSecret
这是微信开发中最重要的两个参数:
- AppID:应用的唯一标识,相当于你的应用的"身份证号"
- AppSecret:应用的密钥,相当于"密码",需要妥善保管
记住:永远不要把AppSecret泄露给他人或提交到公开的代码仓库!
2.3.2 Access Token
Access Token是调用微信接口的凭证:
- 有效期为2小时
- 需要用AppID和AppSecret换取
- 建议缓存起来,不要频繁获取
2.3.3 OpenID和UnionID
- OpenID:用户在某个应用下的唯一标识
- UnionID:用户在同一开发者账号下所有应用的唯一标识
举个例子:
- 张三在你的小程序A中的OpenID是 "xxx123"
- 张三在你的公众号B中的OpenID是 "yyy456"
- 但他的UnionID在两个应用中都是 "zzz789"
2.3.4 微信服务器和开发者服务器
理解两个服务器的关系很重要:
- 微信服务器:微信官方的服务器,提供各种API
- 开发者服务器:就是我们要开发的Spring Boot应用
交互流程通常是:
用户 <-> 微信客户端 <-> 微信服务器 <-> 开发者服务器
2.4 开发流程概览
整个开发流程可以分为以下步骤:
-
准备阶段
- 注册微信开发者账号
- 创建小程序/公众号
- 获取开发凭证
-
开发阶段
- 搭建Spring Boot项目
- 实现业务功能
- 调试测试
-
部署阶段
- 购买服务器和域名
- 部署应用
- 配置HTTPS
-
上线阶段
- 提交审核
- 发布上线
- 运营维护
接下来,我们就按照这个流程,一步步完成整个项目的开发。
3. 项目搭建:从零开始
这一章我们将从零开始搭建一个Spring Boot项目。我会详细解释每一步,确保初学者也能轻松上手。
3.1 创建Spring Boot项目
3.1.1 使用Spring Initializr创建项目
Spring Initializr是创建Spring Boot项目最简单的方式。
方法一:使用网页版
-
打开 https://start.spring.io/
-
填写项目信息:
- Project: Maven Project
- Language: Java
- Spring Boot: 2.7.14(选择2.x的最新稳定版)
- Project Metadata:
- Group: com.example(你的公司域名倒写)
- Artifact: wechat-demo(项目名称)
- Name: wechat-demo
- Description: 微信小程序和公众号后端
- Package name: com.example.wechat
- Packaging: Jar
- Java: 8
-
添加依赖(Dependencies):
- Spring Web(必选)
- Spring Data JPA(数据库访问)
- MySQL Driver(MySQL驱动)
- Spring Data Redis(Redis支持)
- Lombok(简化代码)
- Spring Boot DevTools(开发工具)
-
点击"Generate"下载项目压缩包
-
解压并用IDEA打开项目
方法二:使用IDEA创建
- 打开IDEA,选择 File → New → Project
- 选择 Spring Initializr
- 填写项目信息(同上)
- 选择依赖(同上)
- 完成创建
3.1.2 项目初始配置
项目创建后,我们需要做一些初始配置:
- 配置application.properties
将src/main/resources/application.properties
改名为application.yml
(YAML格式更清晰),并添加以下内容:
# 服务器配置
server:
port: 8080 # 服务端口
servlet:
context-path: /api # 接口前缀
# Spring配置
spring:
application:
name: wechat-demo # 应用名称
# 数据库配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/wechat_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: your_password # 改成你的密码
# JPA配置
jpa:
hibernate:
ddl-auto: update # 自动更新表结构
show-sql: true # 显示SQL语句
properties:
hibernate:
format_sql: true # 格式化SQL语句
# Redis配置(如果安装了Redis)
redis:
host: localhost
port: 6379
password: # 如果没有密码就留空
# 日志配置
logging:
level:
com.example.wechat: DEBUG # 设置项目日志级别
- 创建数据库
打开MySQL客户端,执行以下SQL:
CREATE DATABASE wechat_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 运行测试
找到主类WechatDemoApplication.java
,点击运行。如果看到以下日志,说明项目启动成功:
Started WechatDemoApplication in x.xxx seconds
在浏览器访问 http://localhost:8080/api ,应该会看到404错误页面(因为还没有写接口),这是正常的。
3.2 项目结构详解
一个清晰的项目结构对于项目的可维护性至关重要。下面我详细介绍每个包的作用和命名规范。
3.2.1 标准项目结构
wechat-demo/
├── src/
│ ├── main/
│ │ ├── java/com/example/wechat/
│ │ │ ├── WechatDemoApplication.java # 主启动类
│ │ │ ├── config/ # 配置类包
│ │ │ ├── controller/ # 控制器包
│ │ │ ├── service/ # 业务逻辑包
│ │ │ ├── repository/ # 数据访问包
│ │ │ ├── entity/ # 实体类包
│ │ │ ├── dto/ # 数据传输对象包
│ │ │ ├── enums/ # 枚举类包
│ │ │ ├── utils/ # 工具类包
│ │ │ ├── exception/ # 异常类包
│ │ │ └── interceptor/ # 拦截器包
│ │ └── resources/
│ │ ├── application.yml # 主配置文件
│ │ ├── application-dev.yml # 开发环境配置
│ │ ├── application-prod.yml # 生产环境配置
│ │ ├── static/ # 静态资源
│ │ └── templates/ # 模板文件
│ └── test/ # 测试代码
└── pom.xml # Maven配置文件
3.2.2 各个包的详细说明
-
config包 - 存放所有配置类
config/ ├── WechatConfig.java # 微信相关配置 ├── RedisConfig.java # Redis配置 ├── WebMvcConfig.java # Web配置 └── SwaggerConfig.java # API文档配置
-
controller包 - 存放所有控制器(接收请求的地方)
controller/ ├── miniapp/ # 小程序相关接口 │ ├── AuthController.java # 认证接口 │ ├── UserController.java # 用户接口 │ └── PayController.java # 支付接口 ├── mp/ # 公众号相关接口 │ ├── MessageController.java # 消息接口 │ └── MenuController.java # 菜单接口 └── common/ # 通用接口 └── FileController.java # 文件上传接口
-
service包 - 存放业务逻辑
service/ ├── impl/ # 接口实现类 ├── AuthService.java # 认证服务接口 ├── UserService.java # 用户服务接口 └── WechatService.java # 微信服务接口
-
entity包 - 存放数据库实体类
entity/ ├── base/ # 基础实体类 │ └── BaseEntity.java # 包含id、创建时间等公共字段 ├── User.java # 用户实体 └── Order.java # 订单实体
-
dto包 - 存放数据传输对象
dto/ ├── request/ # 请求参数类 │ └── LoginRequest.java └── response/ # 响应数据类 └── LoginResponse.java
3.2.3 创建基础包结构
让我们手动创建这些包结构:
- 在
com.example.wechat
下右键 → New → Package - 依次创建上述所有包
- 这样做的好处是项目结构一目了然,便于团队协作
3.3 依赖配置详解
项目的依赖配置在pom.xml
文件中,让我详细解释每个依赖的作用。
3.3.1 完整的pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Spring Boot父项目,提供默认配置 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.14</version>
<relativePath/>
</parent>
<!-- 项目基本信息 -->
<groupId>com.example</groupId>
<artifactId>wechat-demo</artifactId>
<version>1.0.0</version>
<name>wechat-demo</name>
<description>微信小程序和公众号后端</description>
<!-- 属性配置 -->
<properties>
<java.version>1.8</java.version>
<weixin-java.version>4.4.0</weixin-java.version>
<hutool.version>5.8.21</hutool.version>
</properties>
<dependencies>
<!-- Spring Boot Web启动器:包含了Spring MVC、Tomcat等 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JPA启动器:用于操作数据库 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL驱动:连接MySQL数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Redis启动器:用于缓存 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Lombok:简化代码,自动生成getter/setter等 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 微信开发SDK:这是重点! -->
<!-- 小程序开发包 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>${weixin-java.version}</version>
</dependency>
<!-- 公众号开发包 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>${weixin-java.version}</version>
</dependency>
<!-- 微信支付开发包 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>${weixin-java.version}</version>
</dependency>
<!-- Hutool工具包:提供各种实用工具 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- 参数验证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- 开发工具:支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- 测试相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 构建配置 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.3.2 依赖说明
让我解释一下为什么需要这些依赖:
-
weixin-java系列:这是最重要的依赖,封装了微信API,让我们不用自己处理复杂的签名验证等问题
-
Hutool:一个功能强大的Java工具包,提供了很多实用方法,比如:
- 字符串处理
- 日期处理
- 加密解密
- HTTP请求
-
Lombok:可以通过注解自动生成代码,比如:
@Data // 自动生成getter/setter/toString等方法 public class User { private Long id; private String name; }
-
DevTools:开发时修改代码后自动重启,提高开发效率
3.4 配置文件详解
Spring Boot支持多环境配置,这在实际开发中非常有用。
3.4.1 多环境配置策略
创建三个配置文件:
- application.yml - 公共配置
spring:
profiles:
active: dev # 默认使用开发环境
- application-dev.yml - 开发环境配置
# 开发环境配置
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/wechat_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
jpa:
show-sql: true # 开发环境显示SQL
hibernate:
ddl-auto: update # 自动更新表结构
# 微信配置(这里先用测试号)
wechat:
miniapp:
app-id: wx1234567890abcdef
app-secret: abcdef1234567890abcdef1234567890
mp:
app-id: wx0987654321fedcba
app-secret: fedcba0987654321fedcba0987654321
# 日志配置
logging:
level:
com.example.wechat: DEBUG # 开发环境打印详细日志
- application-prod.yml - 生产环境配置
# 生产环境配置
server:
port: 80
spring:
datasource:
url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/wechat_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: prod_user
password: ${DB_PASSWORD} # 使用环境变量,更安全
jpa:
show-sql: false # 生产环境不显示SQL
hibernate:
ddl-auto: validate # 只验证,不修改表结构
# 微信配置(使用环境变量)
wechat:
miniapp:
app-id: ${MINIAPP_APPID}
app-secret: ${MINIAPP_SECRET}
mp:
app-id: ${MP_APPID}
app-secret: ${MP_SECRET}
# 日志配置
logging:
level:
com.example.wechat: INFO # 生产环境只打印重要日志
file:
name: /var/log/wechat/app.log # 日志文件路径
3.4.2 配置文件使用技巧
-
使用环境变量:敏感信息不要直接写在配置文件中
password: ${DB_PASSWORD:defaultPassword} # 冒号后面是默认值
-
配置分组:相关配置放在一起
wechat: miniapp: app-id: xxx app-secret: xxx mp: app-id: xxx app-secret: xxx
-
切换环境:
- 开发时:
java -jar app.jar --spring.profiles.active=dev
- 生产时:
java -jar app.jar --spring.profiles.active=prod
- 开发时:
4. 微信开发账号配置
这一章我们将详细介绍如何注册和配置微信开发账号。这些步骤看起来繁琐,但每一步都很重要,请耐心完成。
4.1 注册微信小程序
4.1.1 注册流程
-
访问注册页面
- 打开 https://mp.weixin.qq.com/
- 点击右上角"立即注册"
- 选择"小程序"
-
填写账号信息
- 邮箱:每个邮箱只能注册一个小程序
- 密码:设置一个复杂的密码
- 确认密码:再输入一次
- 验证码:输入图片验证码
-
邮箱激活
- 登录邮箱,查收激活邮件
- 点击激活链接
-
信息登记
- 选择主体类型:
- 个人:最简单,适合学习和测试
- 企业:需要营业执照,功能更全
- 填写管理员信息:
- 姓名
- 身份证号
- 手机号
- 微信扫码验证
- 选择主体类型:
-
填写小程序信息
- 小程序名称:想好再填,后期修改有限制
- 小程序简介:简单介绍功能
- 服务类目:选择合适的类目
4.1.2 获取开发凭证
注册成功后,获取开发需要的凭证:
- 登录小程序管理后台
- 左侧菜单:开发 → 开发管理 → 开发设置
- 找到"开发者ID"部分:
- AppID(小程序ID):复制保存
- AppSecret(小程序密钥):点击"生成"或"重置",复制保存
重要提醒:AppSecret只显示一次,一定要保存好!
4.1.3 配置服务器信息
- 在开发设置页面,找到"服务器域名"
- 点击"开始配置"或"修改"
- 填写域名(开发阶段可以先不填):
- request合法域名:
https://your-domain.com
- socket合法域名:
wss://your-domain.com
- uploadFile合法域名:
https://your-domain.com
- downloadFile合法域名:
https://your-domain.com
- request合法域名:
注意:
- 必须是HTTPS
- 不能使用IP地址
- 每月只能修改5次
4.2 注册微信公众号
4.2.1 选择公众号类型
微信公众号有三种类型:
-
订阅号
- 个人和企业都可以注册
- 每天可群发1条消息
- 消息显示在订阅号文件夹中
-
服务号
- 只有企业可以注册
- 每月可群发4条消息
- 消息直接显示在聊天列表
- 支持高级接口(如支付)
-
企业号(已升级为企业微信)
建议:学习阶段注册订阅号即可
4.2.2 注册流程
-
访问注册页面
- 打开 https://mp.weixin.qq.com/
- 点击"立即注册"
- 选择账号类型
-
基本信息
- 邮箱:不能与小程序重复
- 密码
- 验证码
-
选择类型
- 选择"订阅号"
- 选择地区
-
信息登记
- 选择主体类型(个人/企业)
- 填写身份信息
- 管理员微信扫码
-
公众号信息
- 账号名称
- 功能介绍
- 运营地区
4.2.3 配置开发者模式
默认公众号是"编辑模式",我们需要切换到"开发者模式":
-
基本配置
- 左侧菜单:设置与开发 → 基本配置
- 找到"开发者ID":
- AppID:复制保存
- AppSecret:生成并保存
-
服务器配置
- 在基本配置页面,找到"服务器配置"
- 点击"修改配置":
- URL:
https://your-domain.com/api/wechat/mp/portal
- Token:自定义一个字符串(如:mytoken123)
- EncodingAESKey:随机生成
- 消息加解密方式:明文模式(学习阶段)
- URL:
注意:配置服务器URL前,需要先部署好验证接口,否则验证不通过。
4.3 获取开发凭证
让我们整理一下需要保存的所有凭证:
4.3.1 小程序凭证
# 保存到 application-dev.yml
wechat:
miniapp:
app-id: wx1234567890abcdef # 你的小程序AppID
app-secret: abcdef1234567890... # 你的小程序AppSecret
4.3.2 公众号凭证
wechat:
mp:
app-id: wx0987654321fedcba # 你的公众号AppID
app-secret: fedcba0987654321... # 你的公众号AppSecret
token: mytoken123 # 你设置的Token
aes-key: xxx... # 你的EncodingAESKey
4.3.3 测试号(推荐初学者使用)
如果你只是学习,可以使用测试号,功能齐全且无需审核:
-
小程序测试号
- 打开 https://developers.weixin.qq.com/miniprogram/dev/devtools/sandbox.html
- 微信扫码登录
- 获取测试号的AppID和AppSecret
-
公众号测试号
- 打开 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
- 微信扫码登录
- 获取测试号的AppID和AppSecret
4.4 配置服务器信息
4.4.1 本地开发配置
开发阶段,我们的服务运行在本地(localhost),微信服务器无法访问。解决方案:
方案一:使用内网穿透工具
- 下载ngrok:https://ngrok.com/
- 运行命令:
ngrok http 8080
- 获得临时域名:
https://xxx.ngrok.io
- 在微信后台配置这个域名
方案二:使用测试号
- 测试号没有域名限制
- 可以直接用本地地址测试
4.4.2 生产环境配置
部署到生产环境需要:
-
购买云服务器
- 阿里云、腾讯云、华为云等
- 最低配置:1核2G即可
-
购买域名
- 需要备案(约20天)
- 建议买.com或.cn域名
-
配置HTTPS
- 申请SSL证书(可以免费)
- 配置到服务器
-
更新微信后台配置
- 将域名配置到微信后台
- 确保服务器可以正常访问
5. 数据库设计与实现
良好的数据库设计是项目成功的基础。这一章我们将设计一个简单但完整的数据库结构。
5.1 数据库设计原则
在设计数据库时,我们要遵循以下原则:
- 简单明了:表名和字段名要直观易懂
- 适度冗余:为了查询性能,可以适当冗余
- 考虑扩展:预留扩展字段
- 统一规范:命名规范要统一
5.1.1 命名规范
- 表名:使用复数形式,如
users
、orders
- 字段名:使用下划线分隔,如
user_name
、create_time
- 主键:统一使用
id
- 时间字段:
create_time
(创建时间)、update_time
(更新时间)
5.1.2 字段类型选择
- ID:使用
BIGINT
,支持很大的数据量 - 字符串:短字符串用
VARCHAR
,长文本用TEXT
- 时间:使用
DATETIME
- 金额:使用
DECIMAL
或者BIGINT
(存储分)
5.2 用户表设计
用户表是最核心的表,我们需要存储微信用户信息和系统用户信息。
5.2.1 用户表SQL
-- 创建用户表
CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`open_id` varchar(50) NOT NULL COMMENT '微信OpenID',
`union_id` varchar(50) DEFAULT NULL COMMENT '微信UnionID',
`nick_name` varchar(50) DEFAULT NULL COMMENT '微信昵称',
`avatar_url` varchar(500) DEFAULT NULL COMMENT '头像地址',
`gender` tinyint DEFAULT '0' COMMENT '性别:0-未知,1-男,2-女',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`real_name` varchar(20) DEFAULT NULL COMMENT '真实姓名',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-正常',
`user_type` tinyint NOT NULL DEFAULT '0' COMMENT '用户类型:0-普通用户,1-VIP用户',
`balance` bigint NOT NULL DEFAULT '0' COMMENT '账户余额(分)',
`points` int NOT NULL DEFAULT '0' COMMENT '积分',
`last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_open_id` (`open_id`),
KEY `idx_union_id` (`union_id`),
KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
5.2.2 字段说明
让我解释一下为什么这样设计:
-
open_id和union_id
- open_id:用户在小程序或公众号中的唯一标识
- union_id:如果你有多个应用,用户在所有应用中的统一标识
-
余额存储为分
- 避免浮点数精度问题
- 100分 = 1元
-
索引设计
- open_id设置唯一索引,提高查询效率
- phone设置普通索引,支持手机号查询
5.3 业务表设计
除了用户表,我们还需要设计一些业务表。这里以商品和订单为例。
5.3.1 商品表
-- 商品表
CREATE TABLE `products` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`name` varchar(100) NOT NULL COMMENT '商品名称',
`description` text COMMENT '商品描述',
`price` bigint NOT NULL COMMENT '价格(分)',
`stock` int NOT NULL DEFAULT '0' COMMENT '库存',
`category_id` bigint DEFAULT NULL COMMENT '分类ID',
`main_image` varchar(500) DEFAULT NULL COMMENT '主图',
`images` text COMMENT '商品图片(JSON数组)',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:0-下架,1-上架',
`sort_order` int NOT NULL DEFAULT '0' COMMENT '排序',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_category` (`category_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
5.3.2 订单表
-- 订单表
CREATE TABLE `orders` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`order_no` varchar(32) NOT NULL COMMENT '订单号',
`user_id` bigint NOT NULL COMMENT '用户ID',
`total_amount` bigint NOT NULL COMMENT '订单总金额(分)',
`pay_amount` bigint DEFAULT NULL COMMENT '实付金额(分)',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '订单状态:0-待付款,1-已付款,2-已发货,3-已完成,4-已取消',
`pay_type` tinyint DEFAULT NULL COMMENT '支付方式:1-微信支付,2-余额支付',
`pay_time` datetime DEFAULT NULL COMMENT '支付时间',
`transaction_id` varchar(50) DEFAULT NULL COMMENT '微信支付订单号',
`remark` varchar(200) DEFAULT NULL COMMENT '订单备注',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status`