feat(db): 适配 MySQL 5.7 安装与建表

- 安装 SQL 及安装器统一使用 utf8mb4_general_ci,移除 MySQL 8 专属 0900 排序规则
- JSON 字段移除表达式默认值,改为 DEFAULT NULL,兼容 MySQL 5.7
- 124 张表统一显式 ROW_FORMAT=DYNAMIC,避免依赖 innodb_default_row_format
- 安装程序最低版本调整为 MySQL 5.7,连接字符集改为 utf8mb4
- 同步 README、帮助文档、数据库规范与模块 Installer
This commit is contained in:
吴昊天 2026-10-23 09:30:45 +08:00
parent 7446bf25a4
commit 997659de67
18 changed files with 162 additions and 162 deletions

View File

@ -14,7 +14,7 @@ CRMEB v8 电商系统,三端一体:
| 区域 | 目录 | 技术栈 |
| --- | --- | --- |
| 后端 | `backend/` | PHP 8.2-8.4 + ThinkPHP 8 + MySQL 8 + Redis,多应用入口 `adminapi` / `api` |
| 后端 | `backend/` | PHP 8.2-8.4 + ThinkPHP 8 + MySQL 5.7+(推荐 8.0)+ Redis,多应用入口 `adminapi` / `api` |
| 管理后台 | `frontend/admin/` | Vue 3.5 + Element Plus 2.9 + Pinia 2 + vue-router 4 + Vite 5(纯 JS) |
| 移动端 | `frontend/uni-app/` | uni-app 官方 CLI(Vite 5)+ Vue 3 + Pinia + Sass |

View File

@ -11,7 +11,7 @@ description: 数据库设计与变更规范 - 表前缀/命名、主键与字段
1. **表前缀统一 `eb_`,表名与字段名一律 `snake_case` 全小写**:表名用业务名词(`eb_after_sale`、`eb_order_center`),禁止驼峰、禁止复数后缀堆砌。
2. **主键统一 `id bigint unsigned NOT NULL AUTO_INCREMENT`**,禁止业务字段作主键、禁止复合主键(唯一性用 `UNIQUE KEY`)。
3. **每张表必须有表级中文 `COMMENT`**;**每个字段必须有中文 `COMMENT`**,枚举型字段的 COMMENT 必须列全可选值(如 `状态: pending_audit/audit_passed/...`)。
4. **引擎与字符集固定**:`ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci`,禁止改字符集/排序规则。
4. **引擎与字符集固定**:`ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci`,禁止改字符集/排序规则;该排序规则同时兼容 MySQL 5.7+ 与 8.0。
5. **禁止外键约束**:表间关联只保留 `xxx_id` 逻辑字段 + 索引,由应用层保证一致性。
## 二、字段类型约定(强制)

View File

@ -13,7 +13,7 @@
| `crmeb_timer` | crmeb_php:8.2 | — | 定时任务(`php think timer start`) |
| `crmeb_queue` | crmeb_php:8.2 | — | Redis 队列消费(`docker/queue-worker.sh`,只读挂载为容器内 `/repo/docker/queue-worker.sh`) |
| `crmeb_workerman` | crmeb_php:8.2 | `40001` | WebSocket 网关与 Channel 服务 |
| `crmeb_mysql` | mysql:v8.0.45 | `33061` → 3306 | MySQL 8.0,数据目录 `docker/mysql/data/` |
| `crmeb_mysql` | mysql:v8.0.45 | `33061` → 3306 | Docker 默认 MySQL 8.0;代码/安装 SQL 兼容 MySQL 5.7+,数据目录 `docker/mysql/data/` |
| `crmeb_redis` | redis:v8.6.1 | `63791` → 6379 | Redis,密码 `123456`(本地默认) |
> PHP 支持范围 **8.2-8.4**,四个 PHP 容器共用同一镜像,镜像标签默认取支持范围下限 `crmeb_php:8.2`。验证其它版本:`PHP_VERSION=8.3 docker compose up -d --build`(8.4 同理),构建参数见 `docker/php/Dockerfile`。

View File

@ -6,10 +6,10 @@
| 区域 | 当前实现 |
|---|---|
| 后端 | PHP 8.2-8.4、ThinkPHP 8、MySQL 8、Redis |
| 后端 | PHP 8.2-8.4、ThinkPHP 8、MySQL 5.7+(推荐 8.0)、Redis |
| Admin | Vue 3.5、Vue Router 4、Pinia 2、Element Plus 2.9、Vite 5 |
| 用户端 | uni-app CLI(Vite 5)工程,Vue 3 + `<script setup>`、Pinia 2、Sass |
| 本地默认运行环境 | 宿主机 PHP 8.2-8.4 + MySQL 8 + Redis;HTTP 端口 `8011`,数据服务按 `backend/.env` 实际配置 |
| 本地默认运行环境 | 宿主机 PHP 8.2-8.4 + MySQL 5.7+(推荐 8.0)+ Redis;HTTP 端口 `8011`,数据服务按 `backend/.env` 实际配置 |
| 可选容器环境 | Docker Compose:Nginx `8011`、MySQL `33061`、Redis `63791` |
版本信息以 `backend/composer.json`、`frontend/admin/package.json`、`frontend/uni-app/package.json` 和当前代码为准。管理端与用户端均已完成 Vue 3 迁移,README 中残留的 Vue 2 / Vuex / element-ui / ThinkPHP 6 描述属于过期资料。

View File

@ -2,7 +2,7 @@
> 基于 ThinkPHP 8.0 的三端一体电商 CRM 系统:后端 + 管理端(Vue 3)+ 移动端(uni-app),支持 PC / H5 / 小程序 / APP。
**后端运行环境**:PHP 8.2-8.4 + MySQL 8.0 + Redis | **前端构建**:Node >= 18.20
**后端运行环境**:PHP 8.2-8.4 + MySQL 5.7+(推荐 8.0)+ Redis | **前端构建**:Node >= 18.20
**主开发分支**:`v8.0.dev`,正式发布以 Release / Tag 为准
> 本仓库提供统一的 AI 开发入口(AGENTS.md 标准)。使用 Claude Code、Cursor、Codex、Copilot 等 AI 工具开发本项目前,请让 AI 先读取 [AGENTS.md](AGENTS.md) → [.crmeb/AGENTS.md](.crmeb/AGENTS.md)。详见下文[用 AI 开发本项目](#用-ai-开发本项目)。
@ -15,7 +15,7 @@
cd backend
composer install
# 配置 backend/.env 并确保 MySQL 8、Redis 已在宿主机运行后启动
# 配置 backend/.env 并确保 MySQL 5.7+(推荐 8.0)、Redis 已在宿主机运行后启动
php think run --host 127.0.0.1 --port 8011
```
@ -54,7 +54,7 @@ php think run --host 127.0.0.1 --port 8011
| 服务 | 端口 |
|------|------|
| Nginx(Web 入口) | `8011` |
| MySQL 8.0 | `33061` |
| MySQL 8.0(兼容 5.7+) | `33061` |
| Redis | `63791` |
| Workerman(WebSocket) | `40001` |

View File

@ -88,7 +88,7 @@ class SystemCrudServices extends BaseService
];
//表字符集
const TABLR_COLLATION = 'utf8mb4_0900_ai_ci';
const TABLR_COLLATION = 'utf8mb4_general_ci';
/**
* SystemCrudServices constructor.

View File

@ -44,7 +44,7 @@ class CreateModuleInstallLogTable
{
$this->prefix = (string) config('database.connections.mysql.prefix', 'eb_');
$this->charset = (string) config('database.connections.mysql.charset', 'utf8mb4');
$this->collation = $this->charset === 'utf8mb4' ? 'utf8mb4_0900_ai_ci' : 'utf8_general_ci';
$this->collation = $this->charset === 'utf8mb4' ? 'utf8mb4_general_ci' : 'utf8_general_ci';
}
/**

View File

@ -99,7 +99,7 @@ abstract class BaseModuleInstaller implements ModuleInstallerInterface
{
$this->prefix = (string) config('database.connections.mysql.prefix', 'eb_');
$this->charset = (string) config('database.connections.mysql.charset', 'utf8mb4');
$this->collation = $this->charset === 'utf8mb4' ? 'utf8mb4_0900_ai_ci' : 'utf8_general_ci';
$this->collation = $this->charset === 'utf8mb4' ? 'utf8mb4_general_ci' : 'utf8_general_ci';
}
// ============== 安装流程 ==============

View File

@ -154,8 +154,8 @@ class Installer extends BaseModuleInstaller
`sort_order` int NOT NULL DEFAULT '0' COMMENT '排序',
`unit_name` varchar(32) NOT NULL DEFAULT '' COMMENT '默认单位',
`spec_type` tinyint NOT NULL DEFAULT '0' COMMENT '规格类型(0单规格/1多规格)',
`delivery_methods` json NOT NULL DEFAULT (json_array('express')) COMMENT '交付方式(express/pickup/door_service/check_in/digital)',
`freight_config` json NOT NULL DEFAULT (json_object('express', json_object('type','template','postage',0,'temp_id',0), 'door_service', json_object('type','free','postage',0))) COMMENT '运费配置JSON:express节点(type=free/fixed/template,postage,temp_id) + door_service节点(type=free/fixed,postage)',
`delivery_methods` json DEFAULT NULL COMMENT '交付方式(express/pickup/door_service/check_in/digital)',
`freight_config` json DEFAULT NULL COMMENT '运费配置JSON:express节点(type=free/fixed/template,postage,temp_id) + door_service节点(type=free/fixed,postage)',
`is_limit` tinyint NOT NULL DEFAULT '0' COMMENT '是否开启限购(0否/1是)',
`limit_type` tinyint NOT NULL DEFAULT '0' COMMENT '限购类型(1单次/2永久)',
`limit_num` int NOT NULL DEFAULT '0' COMMENT '限购数量',

View File

@ -64,7 +64,7 @@ MySQL 校验(前端提交 `mysqldbpwd` 触发):
| `-2` | MySQL ≥ 5.7 且 `sql_mode` 含 `STRICT_TRANS_TABLES` / `STRICT_ALL_TABLES` / `TRADITIONAL` / `ANSI`,需要调整数据库配置 |
| `-3` | 目标数据库非空(已存在数据表,不允许覆盖安装) |
| `-4` | 数据库不存在且无权限创建 |
| `-5` | MySQL 版本过低(须 ≥ 5.1) |
| `-5` | MySQL 版本过低(须 ≥ 5.7,推荐 8.0) |
Redis 校验(前端提交 `redisdbpwd` 触发):实际执行 `connect` → `auth`(有密码时)→ `select`(指定库时)→ `set` 写入测试键,返回 `1` 成功、`-1` redis 扩展缺失或对象创建失败、`-3` 连接或写入失败。
@ -171,7 +171,7 @@ Redis 校验(前端提交 `redisdbpwd` 触发):实际执行 `connect` →
- **防重复安装**:入口处检测 `public/install.lock`,存在即阻止进入向导;如需重装,需手动删除 `public/install.lock`。
- **环境变量优先**:数据库和 Redis 连接信息默认值优先从容器的 `MYSQL_HOST_IP`、`MYSQL_PORT`、`MYSQL_USER`、`MYSQL_PASSWORD`、`MYSQL_DATABASE`、`REDIS_HOST_IP` 等环境变量获取,适用于 Docker 部署场景;表单填写值仍以步骤3提交为准。
- **表前缀替换**:SQL 文件默认使用 `eb_` 前缀,安装时按反引号整体形式动态替换为用户配置前缀;覆盖安装时 `DROP TABLE` 按实际前缀执行。
- **数据库不存在时自动创建**:按 `utf8mb4` / `utf8mb4_0900_ai_ci` 字符集执行 `CREATE DATABASE IF NOT EXISTS`。
- **数据库不存在时自动创建**:按 `utf8mb4` / `utf8mb4_general_ci` 字符集执行 `CREATE DATABASE IF NOT EXISTS`。
- **管理员账户**:收尾阶段清空 `system_admin` 后写入 id=1 的超级管理员(账号为步骤3填写,密码经 `PASSWORD_BCRYPT` 加密,角色 `roles=1`)。
- **站点域名写入**:收尾阶段将安装访问域名以 JSON 字符串形式更新到 `system_config` 的 `site_url`(与系统配置读取侧 `json_decode` 约定一致)。
- **最低要求**:PHP 8.2-8.4(不含 8.5+),MySQL ≥ 5.1(5.7+ 需关闭严格 sql_mode),Redis 扩展(选择 redis 缓存时必需)。
- **最低要求**:PHP 8.2-8.4(不含 8.5+),MySQL ≥ 5.7(推荐 8.0;5.7 需关闭严格 sql_mode),Redis 扩展(选择 redis 缓存时必需)。

File diff suppressed because it is too large Load Diff

View File

@ -187,13 +187,13 @@ switch ($step) {
die(json_encode(-1));//链接失败
}
} else {
if (mysqli_get_server_info($conn) < 5.1) {
if (version_compare(mysqli_get_server_info($conn), '5.7', '<')) {
die(json_encode(-5));//版本过低
}
$result = mysqli_query($conn, "SELECT @@global.sql_mode");
$result = $result->fetch_array();
$version = mysqli_get_server_info($conn);
if ($version >= 5.7) {
if (version_compare($version, '5.7', '>=')) {
if (strstr($result[0], 'STRICT_TRANS_TABLES') || strstr($result[0], 'STRICT_ALL_TABLES') || strstr($result[0], 'TRADITIONAL') || strstr($result[0], 'ANSI'))
exit(json_encode(-2));//数据库配置需要修改
}
@ -205,7 +205,7 @@ switch ($step) {
} else {
if (!@mysqli_select_db($conn, $dbName)) {
//创建数据时同时设置编码
if (!mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `" . $dbName . "` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;")) {
if (!mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `" . $dbName . "` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;")) {
exit(json_encode(-4));//无权限创建数据库
} else {
mysqli_query($conn, "DROP DATABASE `" . $dbName . "` ;");
@ -301,16 +301,16 @@ switch ($step) {
$arr['msg'] = "连接数据库失败!" . mysqli_connect_error();
exit(json_encode($arr));
}
mysqli_set_charset($conn, "utf8"); //,character_set_client=binary,sql_mode='';
mysqli_set_charset($conn, "utf8mb4");
$version = mysqli_get_server_info($conn);
if ($version < 5.1) {
$arr['msg'] = '数据库版本太低! 必须5.1以上';
if (version_compare($version, '5.7', '<')) {
$arr['msg'] = '数据库版本太低! 必须5.7以上';
exit(json_encode($arr));
}
if (!mysqli_select_db($conn, $dbName)) {
//创建数据时同时设置编码
if (!mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `" . $dbName . "` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;")) {
if (!mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `" . $dbName . "` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;")) {
$arr['msg'] = '数据库 ' . $dbName . ' 不存在,也没权限创建新的数据库!';
exit(json_encode($arr));
}
@ -550,14 +550,14 @@ function handleInstallPhase(string $phase, int $cursor, array $config): void
if (!$conn || mysqli_connect_errno()) {
exit(json_encode(['n' => -2, 'msg' => '连接数据库失败!' . mysqli_connect_error()], JSON_UNESCAPED_UNICODE));
}
mysqli_set_charset($conn, 'utf8');
if (mysqli_get_server_info($conn) < 5.1) {
exit(json_encode(['n' => -2, 'msg' => '数据库版本太低! 必须5.1以上'], JSON_UNESCAPED_UNICODE));
mysqli_set_charset($conn, 'utf8mb4');
if (version_compare(mysqli_get_server_info($conn), '5.7', '<')) {
exit(json_encode(['n' => -2, 'msg' => '数据库版本太低! 必须5.7以上'], JSON_UNESCAPED_UNICODE));
}
$dbName = $config['dbName'];
if (!mysqli_select_db($conn, $dbName)) {
if (!mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `" . $dbName . "` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;")) {
if (!mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `" . $dbName . "` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;")) {
exit(json_encode(['n' => -2, 'msg' => '数据库 ' . $dbName . ' 不存在,也没权限创建新的数据库!'], JSON_UNESCAPED_UNICODE));
}
mysqli_select_db($conn, $dbName);

View File

@ -56,7 +56,7 @@ cd backend
composer install
```
然后配置 `backend/.env`,在宿主机启动 MySQL 8 和 Redis,并通过安装向导或安装 SQL 初始化数据库。Web 服务根目录应指向 `backend/public`,并确保 `runtime` 和上传目录对 PHP 进程可写。开发期可直接使用 `php think run --host 127.0.0.1 --port 8011`。
然后配置 `backend/.env`,在宿主机启动 MySQL 5.7+(推荐 8.0)和 Redis,并通过安装向导或安装 SQL 初始化数据库。Web 服务根目录应指向 `backend/public`,并确保 `runtime` 和上传目录对 PHP 进程可写。开发期可直接使用 `php think run --host 127.0.0.1 --port 8011`。
宿主机开发常见端口:

View File

@ -4,7 +4,7 @@
## 1. 总览
系统使用 MySQL 8,默认数据库表前缀为 `eb_`,字符集为 `utf8mb4`。ThinkPHP 数据库配置位于 `backend/config/database.php`,支持通过环境变量覆盖连接和表前缀。
系统使用 MySQL 5.7+(推荐 8.0),默认数据库表前缀为 `eb_`,字符集为 `utf8mb4`。ThinkPHP 数据库配置位于 `backend/config/database.php`,支持通过环境变量覆盖连接和表前缀。
本项目的数据结构不是由单一文件完整定义,而来自三类来源:

View File

@ -13,7 +13,7 @@
| 后端 | ThinkPHP 8、多应用模式、PHP 8.2-8.4 |
| 管理端 | Vue 3.5、Vue Router 4、Pinia 2、Element Plus 2.9、Vite 5(纯 JS) |
| 用户端 | uni-app 官方 CLI、Vue 3、Pinia 2、Vite 5,多端条件编译;源码在 `frontend/uni-app/src/` |
| 基础设施 | MySQL 8、Redis、Nginx、PHP-FPM、Workerman |
| 基础设施 | MySQL 5.7+(推荐 8.0)、Redis、Nginx、PHP-FPM、Workerman |
> 文档中的数量是本次检查时的快照。模块、路由、页面和数据表会随插件安装状态与后续开发变化,运行时状态应以数据库和代码为准。

View File

@ -8,7 +8,7 @@
- Nginx 或等价反向代理;
- PHP-FPM 8.2-8.4;
- MySQL 8;
- MySQL 5.7+(推荐 8.0);
- Redis;
- Redis 队列消费者;
- Timer 定时进程;

View File

@ -29,7 +29,7 @@ flowchart LR
KefuAPI --> Core
OutAPI --> Core
Core --> MySQL[(MySQL 8)]
Core --> MySQL[(MySQL 5.7+)]
Core --> Redis[(Redis)]
Core --> Queue[队列消费者]
Core --> WS[Workerman WebSocket]

View File

@ -155,7 +155,7 @@ crmebbz/
|---|---|
| Web 框架 | ThinkPHP 8、think-multi-app |
| ORM/数据访问 | ThinkPHP ORM + Model/DAO/Services 分层 |
| 数据库 | MySQL 8、`utf8mb4`、默认表前缀 `eb_` |
| 数据库 | MySQL 5.7+(推荐 8.0)、`utf8mb4`、默认表前缀 `eb_` |
| 缓存 | 文件缓存或 Redis,生产建议 Redis |
| 队列 | `topthink/think-queue`,默认 Redis 连接 |
| 实时通信 | Workerman + Channel,统一 WebSocket 网关 |
@ -187,7 +187,7 @@ crmebbz/
### 8.1 宿主机开发环境(默认)
前置条件:PHP 8.2-8.4、Composer 2、MySQL 8 和 Redis。数据服务连接以 `backend/.env` 为准,不默认假定 Docker 容器名或映射端口。
前置条件:PHP 8.2-8.4、Composer 2、MySQL 5.7+(推荐 8.0)和 Redis。数据服务连接以 `backend/.env` 为准,不默认假定 Docker 容器名或映射端口。
日常启动使用: