From be9ae8a0d9a7b47231da988daa4c7bd1aeb8b8f5 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 24 Feb 2026 18:56:52 +0800 Subject: [PATCH] fix: switch to xserver database with UTF-8 data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change default database from x_server_mobile to xserver - Add 007_xserver_init.sql initialization script - Companies data now correctly encoded in UTF-8: - 合塑 (hesu) - 新友合 (xinyouhe) - 派卡 (paika) - 斯玛特 (simate) - magic bridge Auto (mbaf) - Company Feishu apps properly configured The key fix is to execute SQL directly inside the MySQL container using heredoc to avoid charset conversion issues during transfer. Usage: docker exec 1Panel-mysql-409s mysql -uroot -p'mysql_xEsdPa' --default-character-set=utf8mb4 xserver < 007_xserver_init.sql Co-Authored-By: Claude Opus 4.6 --- backend/config/database.php | 2 +- .../database/migrations/007_xserver_init.sql | 111 ++++++++++++++++++ mysql-utf8fix.cnf | 16 +++ 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 backend/database/migrations/007_xserver_init.sql create mode 100644 mysql-utf8fix.cnf diff --git a/backend/config/database.php b/backend/config/database.php index 095ad5f..6328f54 100644 --- a/backend/config/database.php +++ b/backend/config/database.php @@ -7,7 +7,7 @@ return [ 'driver' => 'mysql', 'host' => getenv('DB_HOST') ?: 'mysql', 'port' => getenv('DB_PORT') ?: 3306, - 'database' => getenv('DB_DATABASE') ?: 'x_server_mobile', + 'database' => getenv('DB_DATABASE') ?: 'xserver', 'username' => getenv('DB_USERNAME') ?: 'root', 'password' => getenv('DB_PASSWORD') ?: '123456', 'unix_socket' => getenv('DB_SOCKET') ?: '', diff --git a/backend/database/migrations/007_xserver_init.sql b/backend/database/migrations/007_xserver_init.sql new file mode 100644 index 0000000..2ccbe84 --- /dev/null +++ b/backend/database/migrations/007_xserver_init.sql @@ -0,0 +1,111 @@ +-- XServer 数据库初始化脚本 +-- 使用 UTF-8 编码保存此文件 +-- 执行方式:在 MySQL 容器内执行,确保使用正确的字符集 + +-- 重要:必须在容器内部直接执行,避免字符集转换问题 +-- docker exec 1Panel-mysql-409s mysql -uroot -p'mysql_xEsdPa' --default-character-set=utf8mb4 xserver < 007_xserver_init.sql + +SET NAMES utf8mb4; +SET CHARACTER SET utf8mb4; + +USE xserver; + +-- ===================================== +-- 1. 公司表(companies) +-- ===================================== +DROP TABLE IF EXISTS companies; +CREATE TABLE `companies` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '公司ID', + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '公司名称', + `abbr` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '公司缩写', + `tenant_key` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '飞书企业标识', + `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1=启用,0=禁用', + `feishu_enabled` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否启用飞书', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司表'; + +-- 插入公司数据 +INSERT INTO companies (name, abbr, tenant_key, status, sort, feishu_enabled) VALUES +("合塑", "hesu", "10edab4d5d85175f", 1, 1, 1), +("新友合", "xinyouhe", "14e7bc0fe5985740", 1, 2, 1), +("派卡", "paika", "14e5377859d71740", 1, 3, 1), +("斯玛特", "simate", "", 0, 4, 0), +("magic bridge Auto", "mbaf", "", 1, 5, 0); + +-- ===================================== +-- 2. 用户表(users) +-- ===================================== +DROP TABLE IF EXISTS users; +CREATE TABLE `users` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `sn` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户编号', + `company_id` bigint unsigned NOT NULL COMMENT '所属公司ID', + `report_to` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '上级用户ID', + `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名', + `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '头像URL', + `sex` tinyint(2) NULL DEFAULT NULL COMMENT '性别:1=男,2=女', + `email` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '邮箱', + `phone` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号', + `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1=正常,0=禁用', + `user_type` tinyint(2) NOT NULL DEFAULT 1 COMMENT '用户类型:1=内部,2=外部', + `union_id` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '飞书UnionID', + `feishu_user_id` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '飞书用户ID', + `feishu_open_id` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '飞书OpenID', + `tenant_key` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '当前企业标识', + `position` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '职位', + `sign_img` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '签名图片', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_company_id` (`company_id`), + KEY `idx_feishu_user_id` (`feishu_user_id`), + KEY `idx_feishu_union_id` (`union_id`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'; + +-- ===================================== +-- 3. 飞书应用配置表(company_feishu_apps) +-- ===================================== +DROP TABLE IF EXISTS company_feishu_apps; +CREATE TABLE `company_feishu_apps` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', + `company_id` int(11) NOT NULL COMMENT '公司ID', + `system_id` int(11) NOT NULL DEFAULT 1 COMMENT '系统ID:1=X-Server', + `name` varchar(90) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '应用名称', + `app_id` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '飞书应用ID', + `app_secret` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '飞书应用密钥', + `encrypt_key` varchar(60) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '事件加密密钥', + `verification_token` varchar(60) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '事件验证令牌', + `callback_url` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'PC端回调地址', + `mobile_callback_url` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '移动端回调地址', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:1=启用,0=禁用', + `created_at` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + `updated_at` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_company_id` (`company_id`) USING BTREE, + KEY `idx_system_id` (`system_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司飞书应用配置表'; + +-- 插入飞书应用配置 +INSERT INTO company_feishu_apps (company_id, system_id, name, app_id, app_secret, callback_url, mobile_callback_url, status, created_at, updated_at) VALUES +(2, 1, "X-Server", "cli_a73e1e6406fa501c", "9cMfxujjGG9JPmNfNcOwUdCoIXqaM1wY", "https://x.hnxinyouhe.com/auth/feishu-callback", "https://mweb-fdesk.hnxinyouhe.com/login/feishu-callback", 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(3, 1, "X-Server", "cli_a73e8253144f500b", "MpLqRmfWx8iA8vwWj5IO6elvIKAHU8E6", "https://x.hnxinyouhe.com/auth/feishu-callback", "https://mweb-fdesk.hnxinyouhe.com/login/feishu-callback", 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(1, 1, "X-Server", "cli_a6183b882cb8500d", "VqYib48u4EtDIa6nG9qH3f0fYCA1bCvs", "https://x.hnxinyouhe.com/auth/feishu-callback", "https://mweb-fdesk.hnxinyouhe.com/login/feishu-callback", 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); + +-- ===================================== +-- 验证结果 +-- ===================================== +SELECT "=== companies 表数据 ===" as ""; +SELECT id, name, abbr, tenant_key FROM companies ORDER BY id; + +SELECT "=== company_feishu_apps 表数据 ===" as ""; +SELECT id, company_id, name, app_id FROM company_feishu_apps ORDER BY id; + +SELECT "=== 统计信息 ===" as ""; +SELECT COUNT(*) as company_count FROM companies; +SELECT COUNT(*) as feishu_app_count FROM company_feishu_apps; diff --git a/mysql-utf8fix.cnf b/mysql-utf8fix.cnf new file mode 100644 index 0000000..2c0bf93 --- /dev/null +++ b/mysql-utf8fix.cnf @@ -0,0 +1,16 @@ +# MySQL UTF-8 字符集配置 +# 放到 /etc/mysql/conf.d/ 或 /etc/my.cnf.d/ 目录下 + +[client] +default-character-set = utf8mb4 + +[mysql] +default-character-set = utf8mb4 + +[mysqld] +character-set-server = utf8mb4 +collation-server = utf8mb4_unicode_ci +init_connect = 'SET NAMES utf8mb4' + +# 确保客户端连接使用正确字符集 +skip-character-set-client-handshake = 0