mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-28 13:31:04 +00:00
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:
parent
7446bf25a4
commit
997659de67
@ -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 |
|
||||
|
||||
|
||||
@ -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` 逻辑字段 + 索引,由应用层保证一致性。
|
||||
|
||||
## 二、字段类型约定(强制)
|
||||
|
||||
@ -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`。
|
||||
|
||||
@ -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 描述属于过期资料。
|
||||
|
||||
@ -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` |
|
||||
|
||||
|
||||
@ -88,7 +88,7 @@ class SystemCrudServices extends BaseService
|
||||
];
|
||||
|
||||
//表字符集
|
||||
const TABLR_COLLATION = 'utf8mb4_0900_ai_ci';
|
||||
const TABLR_COLLATION = 'utf8mb4_general_ci';
|
||||
|
||||
/**
|
||||
* SystemCrudServices constructor.
|
||||
|
||||
@ -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';
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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';
|
||||
}
|
||||
|
||||
// ============== 安装流程 ==============
|
||||
|
||||
@ -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 '限购数量',
|
||||
|
||||
@ -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
@ -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);
|
||||
|
||||
@ -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`。
|
||||
|
||||
宿主机开发常见端口:
|
||||
|
||||
|
||||
@ -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`,支持通过环境变量覆盖连接和表前缀。
|
||||
|
||||
本项目的数据结构不是由单一文件完整定义,而来自三类来源:
|
||||
|
||||
|
||||
@ -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 |
|
||||
|
||||
> 文档中的数量是本次检查时的快照。模块、路由、页面和数据表会随插件安装状态与后续开发变化,运行时状态应以数据库和代码为准。
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
- Nginx 或等价反向代理;
|
||||
- PHP-FPM 8.2-8.4;
|
||||
- MySQL 8;
|
||||
- MySQL 5.7+(推荐 8.0);
|
||||
- Redis;
|
||||
- Redis 队列消费者;
|
||||
- Timer 定时进程;
|
||||
|
||||
@ -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]
|
||||
|
||||
@ -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 容器名或映射端口。
|
||||
|
||||
日常启动使用:
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user