dockercompose启动mysql容器和springboot项目容器时,mysql容器启动慢导致springboot项目容器启动失败。
报错如下:
bash
vod@vod:~/playedu$ docker logs -f playedu-playedu-1
Waiting for MySQL to start...
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.3.4)
2025-12-12T14:59:29.884+08:00 INFO 14 --- [ main] xyz.playedu.api.PlayeduApiApplication : Starting PlayeduApiApplication v2.0 using Java 17.0.11 with PID 14 (/app/api/app.jar started by root in /)
2025-12-12T14:59:29.887+08:00 INFO 14 --- [ main] xyz.playedu.api.PlayeduApiApplication : The following 1 profile is active: "prod"
2025-12-12T14:59:31.874+08:00 INFO 14 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 9898 (http)
2025-12-12T14:59:31.898+08:00 INFO 14 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2025-12-12T14:59:31.898+08:00 INFO 14 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.30]
2025-12-12T14:59:31.932+08:00 INFO 14 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2025-12-12T14:59:31.933+08:00 INFO 14 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1961 ms
2025-12-12T14:59:35.296+08:00 INFO 14 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 9898 (http) with context path '/'
2025-12-12T14:59:35.308+08:00 INFO 14 --- [ main] xyz.playedu.api.PlayeduApiApplication : Started PlayeduApiApplication in 5.92 seconds (process running for 6.507)
2025-12-12T14:59:35.321+08:00 INFO 14 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2025-12-12T14:59:40.574+08:00 ERROR 14 --- [ main] x.playedu.system.checks.MigrationCheck : 数据库迁移执行失败,错误信息:Failed to obtain JDBC Connection
2025-12-12T14:59:40.652+08:00 INFO 14 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2025-12-12T14:59:40.718+08:00 INFO 14 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@195cbf5e
2025-12-12T14:59:40.719+08:00 INFO 14 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2025-12-12T14:59:40.990+08:00 ERROR 14 --- [ main] x.playedu.system.checks.SystemDataCheck : 超级管理员初始化失败,错误信息:
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'vod.admin_roles' doesn't exist
### The error may exist in xyz/playedu/common/mapper/AdminRoleMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT id,name,slug,created_at,updated_at FROM admin_roles WHERE (slug = ?)
### Cause: java.sql.SQLSyntaxErrorException: Table 'vod.admin_roles' doesn't exist
; bad SQL grammar []
2025-12-12T14:59:40.997+08:00 INFO 14 --- [ main] .s.b.a.l.ConditionEvaluationReportLogger :
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-12-12T14:59:41.011+08:00 ERROR 14 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'vod.app_config' doesn't exist
### The error may exist in xyz/playedu/common/mapper/AppConfigMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT id,group_name,name,sort,field_type,key_name,key_value,option_value,is_private,help,created_at,is_hidden FROM app_config
### Cause: java.sql.SQLSyntaxErrorException: Table 'vod.app_config' doesn't exist
; bad SQL grammar []
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246) ~[spring-jdbc-6.1.13.jar!/:6.1.13]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107) ~[spring-jdbc-6.1.13.jar!/:6.1.13]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) ~[mybatis-spring-3.0.3.jar!/:3.0.3]
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439) ~[mybatis-spring-3.0.3.jar!/:3.0.3]
at jdk.proxy2/jdk.proxy2.$Proxy83.selectList(Unknown Source) ~[na:na]
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) ~[mybatis-spring-3.0.3.jar!/:3.0.3]
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7]
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7]
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7]
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7]
at jdk.proxy2/jdk.proxy2.$Proxy91.selectList(Unknown Source) ~[na:na]
at com.baomidou.mybatisplus.extension.service.IService.list(IService.java:407) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7]
at com.baomidou.mybatisplus.extension.service.IService.list(IService.java:428) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7]
at xyz.playedu.common.service.impl.AppConfigServiceImpl.allKeys(AppConfigServiceImpl.java:47) ~[playedu-common-1.0.jar!/:1.0]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.13.jar!/:6.1.13]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716) ~[spring-aop-6.1.13.jar!/:6.1.13]
at xyz.playedu.common.service.impl.AppConfigServiceImpl$$SpringCGLIB$$0.allKeys(<generated>) ~[playedu-common-1.0.jar!/:1.0]
at xyz.playedu.system.checks.AppConfigCheck.run(AppConfigCheck.java:275) ~[playedu-system-1.0.jar!/:1.0]
at org.sp
问deepseek好多遍,答复的原因是compose.yml配置错误
bash
x-logging: &default-logging
driver: "json-file"
options:
max-size: "10m"
max-file: "10"
networks:
playedu:
driver: bridge
volumes:
mysql-data:
services:
playedu:
image: jltalentcloud:v0.1
restart: always
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_NAME=vod
- DB_USER=root
- DB_PASS=27e3p2xn
- SA_TOKEN_IS_CONCURRENT=false
- SA_TOKEN_JWT_SECRET_KEY=${PLAYEDU_JWT_KEY:-ace42e00}
ports:
- "${PLAYEDU_API_PORT:-10079}:9898"
- "${PLAYEDU_PC_PORT:-10089}:9800"
- "${PLAYEDU_H5_PORT:-11089}:9801"
- "${PLAYEDU_ADMIN_PORT:-10099}:9900"
networks:
- playedu
depends_on:
- mysql
logging: *default-logging
mysql:
build: ./docker/mysql
restart: always
environment:
- MYSQL_DATABASE=vod
- MYSQL_ROOT_PASSWORD=27e3p2xn
- TZ=UTC
volumes:
- mysql-data:/var/lib/mysql
ports:
- "${MYSQL_PORT:-16033}:3306"
networks:
- playedu
logging: *default-logging
deepseek认为mysql容器配置的MYSQL_DATABASE数据库名与springboot项目容器配置的DB_NAME不一致,但是我修改时特意注意了数据库名和密码。也查看了数据库容器的dockerfile创建脚本
bash
# docker\mysql\Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/mysql:8.1
COPY my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 0444 /etc/mysql/conf.d/my.cnf
当执行创建数据库镜像时(在docker\mysql路径下执行docker build .),没有配置任何数据库参数;只有在执行docker-compose up -d时才会按照mysql下的配置启动数据库,并配置库名称。
这里库vod是由docker-compose脚本创建的,创建后vod库是空的,在第一次执行springboot程序是,会进行数据库表迁移。数据库表创建和插入初始化数据是通过执行java代码中所写的sql语句实现的,不像数据库导入导出时所执行vod.sql文件,sql语句在sql文件中。
这解开了我一直以来的迷惑,开始接触这个项目时,我发现整个项目源码中找不到创建数据库的sql脚本,但是数据库却能自动创建。数据库中的数据也不是来自容器初始化,因为刚刚初始化的mysql容器的vod库是空的。
这段java数据库迁移代码如下,这里的sql代码没有创建vod库,只是创建了表:
java
/* playedu\playedu-api\playedu-system\src\main\java\xyz\playedu\system\checks\MigrationCheck.java
*
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package xyz.playedu.system.checks;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import xyz.playedu.system.service.MigrationService;
@Order(10)
@Component
@Slf4j
public class MigrationCheck implements CommandLineRunner {
public static final List<Map<String, String>> TABLE_SQL =
new ArrayList<>() {
{
add(
new HashMap<>() {
{
put("table", "migrations");
put("name", "20231208_14_00_00_migrations");
put(
"sql",
"""
CREATE TABLE `migrations` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`migration` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '变更记录',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程章节表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "admin_permissions");
put("name", "20231208_14_00_00_admin_permissions");
put(
"sql",
"""
CREATE TABLE `admin_permissions` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '类型[行为:action,数据:data]',
`group_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '分组',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
`name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '权限名',
`slug` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'slug',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT 'SQL变更记录表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "admin_logs");
put("name", "20231208_14_00_00_admin_logs");
put(
"sql",
"""
CREATE TABLE `admin_logs`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '管理员ID',
`admin_name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '管理员姓名',
`module` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '模块',
`title` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求方法标题',
`opt` int(2) NOT NULL DEFAULT 0 COMMENT '操作指令(0其它 1新增 2修改 3删除 4登录 5退出登录)',
`method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求方法',
`request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求方式POST,GET,PUT,DELETE',
`url` varchar(266) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求URL',
`param` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '请求参数',
`result` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '返回参数',
`ip` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'IP',
`ip_area` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '地址',
`error_msg` mediumtext COLLATE utf8mb4_unicode_ci COMMENT '错误消息',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `a_m_o` (`admin_id`,`module`,`opt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员操作日志记录表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "admin_role_permission");
put("name", "20231208_14_00_00_admin_role_permission");
put(
"sql",
"""
CREATE TABLE `admin_role_permission` (
`role_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '角色ID',
`perm_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '权限ID',
KEY `role_id` (`role_id`),
KEY `perm_id` (`perm_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员角色权限关联表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "admin_roles");
put("name", "20231208_14_00_00_admin_roles");
put(
"sql",
"""
CREATE TABLE `admin_roles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '角色名',
`slug` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'slug',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `slug` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员角色表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "admin_user_role");
put("name", "20231208_14_00_00_admin_user_role");
put(
"sql",
"""
CREATE TABLE `admin_user_role` (
`admin_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '管理员ID',
`role_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '角色ID',
KEY `admin_id` (`admin_id`),
KEY `role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员角色关联表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "admin_users");
put("name", "20231208_14_00_00_admin_users");
put(
"sql",
"""
CREATE TABLE `admin_users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '姓名',
`email` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱',
`password` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码',
`salt` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'salt',
`login_ip` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '登录IP',
`login_at` timestamp NULL DEFAULT NULL COMMENT '登录时间',
`is_ban_login` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1禁止登录,0否',
`login_times` int(11) NOT NULL DEFAULT 0 COMMENT '登录次数',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `administrators_email_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "app_config");
put("name", "20231208_14_00_00_app_config");
put(
"sql",
"""
CREATE TABLE `app_config` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`group_name` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '分组',
`name` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名称',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
`field_type` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '字段类型',
`key_name` varchar(188) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '键',
`key_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '值',
`option_value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '可选值',
`is_private` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否私密信息',
`help` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '帮助信息',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`is_hidden` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1显示,0否',
PRIMARY KEY (`id`),
UNIQUE KEY `app_config_key_unique` (`key_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '系统配置表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "course_attachment");
put("name", "20231208_14_00_00_course_attachment");
put(
"sql",
"""
CREATE TABLE `course_attachment`
(
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '附件名',
`type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '附件类型',
`rid` int(11) NOT NULL DEFAULT 0 COMMENT '资源ID',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `course_id` (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程附件表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "course_attachment_download_log");
put("name", "20231208_14_00_00_course_attachment_download_log");
put(
"sql",
"""
CREATE TABLE `course_attachment_download_log`
(
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
`course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '课程标题',
`courser_attachment_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程附件ID',
`rid` int(11) NOT NULL DEFAULT 0 COMMENT '资源ID',
`ip` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '下载IP',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程附件下载日志记录表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "course_chapters");
put("name", "20231208_14_00_00_course_chapters");
put(
"sql",
"""
CREATE TABLE `course_chapters` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '章节名',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '管理员权限表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "course_department_user");
put("name", "20231208_14_00_00_course_department_user");
put(
"sql",
"""
CREATE TABLE `course_department_user` (
`course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
`range_id` int(11) NOT NULL DEFAULT 0 COMMENT '指派范围ID',
`type` int(11) NOT NULL DEFAULT 0 COMMENT '指派范围类型[0:部门,1:学员]',
KEY `course_id` ( `course_id` ),
KEY `range_id` ( `range_id` )
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程指派范围表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "course_hour");
put("name", "20231208_14_00_00_course_hour");
put(
"sql",
"""
CREATE TABLE `course_hour` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
`chapter_id` int(11) NOT NULL DEFAULT 0 COMMENT '章节ID',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '课时名',
`type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '课时类型',
`rid` int(11) NOT NULL DEFAULT 0 COMMENT '资源ID',
`duration` int(11) NOT NULL DEFAULT 0 COMMENT '时长[s]',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`deleted` tinyint(1) unsigned NULL DEFAULT 0 COMMENT '删除标志[0:存在,1:删除]',
PRIMARY KEY (`id`),
KEY `course_id` (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程课时表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "courses");
put("name", "20230406_16_51_17_1111_courses");
put(
"sql",
"""
CREATE TABLE `courses` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '课程标题',
`thumb` int(11) NOT NULL DEFAULT 0 COMMENT '封面',
`charge` int(11) NOT NULL DEFAULT 0 COMMENT '课程价格(分)',
`short_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '简介',
`class_hour` int(11) NOT NULL DEFAULT 0 COMMENT '课时数',
`is_show` tinyint(4) NOT NULL DEFAULT 0 COMMENT '显示[1:是,0:否]',
`is_required` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1:必修,0:选修',
`sort_at` timestamp NULL DEFAULT NULL COMMENT '排序时间',
`extra` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '其它规则[设置]',
`admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '管理员ID',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "departments");
put("name", "20230406_16_51_17_1111_departments");
put(
"sql",
"""
CREATE TABLE `departments` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '部门名',
`parent_id` int(11) NOT NULL DEFAULT 0 COMMENT '父ID',
`parent_chain` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '父链',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
`from_scene` int(11) NOT NULL DEFAULT 0 COMMENT '来源[0:本地]',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员上传图片日志记录表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "resource_categories");
put("name", "20231208_14_00_00_resource_categories");
put(
"sql",
"""
CREATE TABLE `resource_categories` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`parent_id` int(11) NOT NULL DEFAULT 0 COMMENT '父ID',
`parent_chain` varchar(2550) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '父链',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '分类名',
`sort` int(11) NOT NULL DEFAULT 0 COMMENT '升序',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '部门表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "resource");
put("name", "20231208_14_00_00_resource");
put(
"sql",
"""
CREATE TABLE `resource` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '管理员ID',
`type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '类型',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '资源名',
`extension` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '文件类型',
`size` bigint(20) DEFAULT 0 COMMENT '大小[字节]',
`disk` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '存储磁盘',
`path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '相对地址',
`parent_id` int(11) NOT NULL DEFAULT 0 COMMENT '所属素材',
`is_hidden` tinyint(4) NOT NULL DEFAULT 0 COMMENT '隐藏[0:否,1:是]',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '资源表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "resource_category");
put("name", "20231208_14_00_00_resource_category");
put(
"sql",
"""
CREATE TABLE `resource_category` (
`cid` int(11) NOT NULL DEFAULT 0 COMMENT '分类ID',
`rid` int(11) NOT NULL DEFAULT 0 COMMENT '资源ID',
KEY `cid` (`cid`),
KEY `rid` (`rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '资源分类关联表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "resource_course_category");
put("name", "20231208_14_00_00_resource_course_category");
put(
"sql",
"""
CREATE TABLE `resource_course_category` (
`course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
`category_id` int(11) NOT NULL DEFAULT 0 COMMENT '父级ID',
KEY `course_id` (`course_id`),
KEY `category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '课程分类关联表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "resource_extra");
put("name", "20231208_14_00_00_resource_extra");
put(
"sql",
"""
CREATE TABLE `resource_extra`(
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`rid` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '资源ID',
`poster` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '封面资源ID',
`duration` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '视频、音频总时长,文档总页数',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `rid` (`rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '资源详细信息表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "user_course_hour_records");
put("name", "20231208_14_00_00_user_course_hour_records");
put(
"sql",
"""
CREATE TABLE `user_course_hour_records` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
`course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
`hour_id` int(11) NOT NULL DEFAULT 0 COMMENT '课时ID',
`total_duration` int(11) NOT NULL DEFAULT 0 COMMENT '总时长',
`finished_duration` int(11) NOT NULL DEFAULT 0 COMMENT '已完成时长',
`real_duration` int(11) NOT NULL DEFAULT 0 COMMENT '实际观看时长',
`is_finished` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否看完[1:是,0:否]',
`finished_at` timestamp NULL DEFAULT NULL COMMENT '看完时间',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
KEY `u_h_c_id` (`user_id`,`hour_id`,`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '线上课课时学员学习记录表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "user_course_records");
put("name", "20231208_14_00_00_user_course_records");
put(
"sql",
"""
CREATE TABLE `user_course_records` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
`course_id` int(11) NOT NULL DEFAULT 0 COMMENT '课程ID',
`hour_count` int(11) NOT NULL DEFAULT 0 COMMENT '课时数量',
`finished_count` int(11) NOT NULL DEFAULT 0 COMMENT '已完成课时数',
`progress` int(11) NOT NULL DEFAULT 0 COMMENT '进度',
`is_finished` tinyint(4) NOT NULL DEFAULT 0 COMMENT '看完[1:是,0:否]',
`finished_at` timestamp NULL DEFAULT NULL COMMENT '看完时间',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '分类表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "user_department");
put("name", "20231208_14_00_00_user_department");
put(
"sql",
"""
CREATE TABLE `user_department` (
`user_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '学员ID',
`dep_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '部门ID',
KEY `user_id` (`user_id`),
KEY `dep_id` (`dep_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员部门关联表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "user_learn_duration_records");
put("name", "20231208_14_00_00_user_learn_duration_records");
put(
"sql",
"""
CREATE TABLE `user_learn_duration_records` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
`created_date` date NOT NULL COMMENT '创建时间',
`duration` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '已学习时长[微秒]',
`start_at` timestamp NULL DEFAULT NULL COMMENT '开始时间',
`end_at` timestamp NULL DEFAULT NULL COMMENT '结束时间',
`from_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '来源ID',
`from_scene` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '记录来源[线上课:COURSE,学习任务:STUDY]',
PRIMARY KEY (`id`),
KEY `u_d` (`user_id`,`created_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员学习时长表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "user_learn_duration_stats");
put("name", "20231208_14_00_00_user_learn_duration_stats");
put(
"sql",
"""
CREATE TABLE `user_learn_duration_stats` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
`duration` bigint(20) NOT NULL DEFAULT 0 COMMENT '学习时长',
`created_date` date NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `u_d` (`user_id`,`created_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员学习时长记录表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "user_login_records");
put("name", "20231208_14_00_00_user_login_records");
put(
"sql",
"""
CREATE TABLE `user_login_records` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员ID',
`jti` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'JTI',
`ip` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '登录IP',
`ip_area` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'IP解析区域',
`browser` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '浏览器',
`browser_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '浏览器版本',
`os` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '操作系统',
`expired` bigint(20) NOT NULL DEFAULT 0 COMMENT '过期时间',
`is_logout` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否注销',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `jti` (`jti`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员登录记录表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "user_upload_image_logs");
put("name", "20231208_14_00_00_user_upload_image_logs");
put(
"sql",
"""
CREATE TABLE `user_upload_image_logs` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '学员时间',
`typed` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '图片类型',
`scene` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '上传场景',
`driver` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '驱动',
`path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '相对路径',
`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '访问地址',
`size` bigint(20) NOT NULL DEFAULT 0 COMMENT '大小,单位:字节',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '文件名',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '线上课学员学习记录表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "users");
put("name", "20231208_14_00_00_users");
put(
"sql",
"""
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`email` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '邮件',
`name` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '真实姓名',
`avatar` int(11) NOT NULL DEFAULT 0 COMMENT '头像',
`password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码',
`salt` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'salt',
`id_card` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '身份证号',
`credit1` int(11) NOT NULL DEFAULT 0 COMMENT '学分',
`create_ip` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '注册IP',
`create_city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '注册城市',
`is_active` tinyint(4) NOT NULL DEFAULT 0 COMMENT '激活[1:是,0:否]',
`is_lock` tinyint(4) NOT NULL DEFAULT 0 COMMENT '锁定[1:是,0:否]',
`is_verify` tinyint(4) NOT NULL DEFAULT 0 COMMENT '实名认证[1:是,0:否]',
`verify_at` timestamp NULL DEFAULT NULL COMMENT '实名认证时间',
`is_set_password` tinyint(4) NOT NULL DEFAULT 0 COMMENT '设置密码[1:是,0:否]',
`login_at` timestamp NULL DEFAULT NULL COMMENT '登录时间',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
`from_scene` int(11) NOT NULL DEFAULT 0 COMMENT '来源[0:本地,1:企业微信,2:飞书]',
`deleted` tinyint(1) unsigned NULL DEFAULT 0 COMMENT '删除标志[0:存在,1:删除]',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '学员表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "ldap_user");
put("name", "20240322_17_29_17_ldap_user");
put(
"sql",
"""
CREATE TABLE `ldap_user` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '唯一特征值',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID',
`cn` varchar(120) NOT NULL DEFAULT '' COMMENT 'cn',
`dn` varchar(120) NOT NULL DEFAULT '' COMMENT 'dn',
`ou` varchar(255) NOT NULL DEFAULT '' COMMENT 'ou',
`uid` varchar(120) NOT NULL DEFAULT '' COMMENT 'uid',
`email` varchar(120) NOT NULL DEFAULT '' COMMENT '邮箱',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_uuid` (`uuid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
""");
}
});
add(
new HashMap<>() {
{
put("table", "ldap_department");
put("name", "20240322_17_29_30_ldap_department");
put(
"sql",
"""
CREATE TABLE `ldap_department` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '唯一特征值',
`department_id` int(11) NOT NULL DEFAULT 0 COMMENT '部门ID',
`dn` varchar(120) NOT NULL DEFAULT '' COMMENT 'dn',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_uuid` (`uuid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
""");
}
});
add(
new HashMap<>() {
{
put("table", "");
put("name", "20250519_09_00_00_migrations-data-insert");
put(
"sql",
"""
INSERT INTO migrations (migration) VALUES
('20231224_14_00_00_update_courses'),
('20240126_15_00_00_course_add_admin_id'),
('20240722_12_00_00_course_hour_add_deleted'),
('20240815_15_00_00_user_deteled_column_add');
""");
}
});
add(
new HashMap<>() {
{
put("table", "ldap_sync_record");
put("name", "20250517_13_23_ldap_sync_record");
put(
"sql",
"""
CREATE TABLE `ldap_sync_record` (
`id` int NOT NULL AUTO_INCREMENT,
`admin_id` int NOT NULL DEFAULT '0' COMMENT '执行同步的管理员ID,0表示系统自动执行',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0-进行中,1-成功,2-失败',
`s3_file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'S3存储中的文件路径',
`total_department_count` int NOT NULL DEFAULT '0' COMMENT '总部门数量',
`created_department_count` int NOT NULL DEFAULT '0' COMMENT '新增部门数量',
`updated_department_count` int NOT NULL DEFAULT '0' COMMENT '更新部门数量',
`deleted_department_count` int NOT NULL DEFAULT '0' COMMENT '删除部门数量',
`total_user_count` int NOT NULL DEFAULT '0' COMMENT '总用户数量',
`created_user_count` int NOT NULL DEFAULT '0' COMMENT '新增用户数量',
`updated_user_count` int NOT NULL DEFAULT '0' COMMENT '更新用户数量',
`deleted_user_count` int NOT NULL DEFAULT '0' COMMENT '删除用户数量',
`banned_user_count` int NOT NULL DEFAULT '0' COMMENT '被禁止的用户数量',
`error_message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '错误信息',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='LDAP同步记录表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "ldap_sync_department_detail");
put("name", "20250519_10_25_01_ldap_sync_department_detail");
put(
"sql",
"""
CREATE TABLE `ldap_sync_department_detail` (
`id` int NOT NULL AUTO_INCREMENT,
`record_id` int NOT NULL COMMENT '关联的同步记录ID',
`department_id` int NOT NULL DEFAULT '0' COMMENT '关联的部门ID',
`uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'LDAP部门UUID',
`dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'LDAP部门DN',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '部门名称',
`action` tinyint NOT NULL COMMENT '操作:1-新增,2-更新,3-删除,4-无变化',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `record_id` (`record_id`),
KEY `department_id` (`department_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='LDAP部门同步详情表';
""");
}
});
add(
new HashMap<>() {
{
put("table", "ldap_sync_user_detail");
put("name", "20250519_10_25_02_ldap_sync_user_detail");
put(
"sql",
"""
CREATE TABLE `ldap_sync_user_detail` (
`id` bigint NOT NULL AUTO_INCREMENT,
`record_id` int NOT NULL COMMENT '关联的同步记录ID',
`user_id` bigint NOT NULL DEFAULT '0' COMMENT '关联的用户ID',
`uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'LDAP用户UUID',
`dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'LDAP用户DN',
`cn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名称',
`uid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户ID/登录名',
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户邮箱',
`ou` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户部门路径',
`action` tinyint NOT NULL COMMENT '操作:1-新增,2-更新,3-删除,4-无变化,5-禁止',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `record_id` (`record_id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='LDAP用户同步详情表';
""");
}
});
}
};
@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private MigrationService migrationService;
@Override
public void run(String... args) throws Exception {
try {
// 数据库已创建的表
List<String> tables = jdbcTemplate.queryForList("show tables", String.class);
// 已创建表的记录
List<String> migrations = new ArrayList<>();
if (tables.contains("migrations")) {
migrations = migrationService.all();
}
for (Map<String, String> tableItem : TABLE_SQL) {
String migrationName = tableItem.get("name");
if (migrations.contains(migrationName)) {
continue;
}
String tableName = tableItem.get("table");
if (!tables.isEmpty() && tables.contains(tableName)) {
// 数据表已创建但是没有创建记录
// 需要保存创建记录
migrationService.store(migrationName);
continue;
}
// 创建数据表
jdbcTemplate.execute(tableItem.get("sql"));
// 记录写入到migrations表中
migrationService.store(migrationName);
}
} catch (Exception e) {
log.error("数据库迁移执行失败,错误信息:" + e.getMessage());
}
}
}
在排除数据库连接参数错误的可能后,我猜想大概是数据库启动时间长,springboot项目容器启动脚本中等待数据库启动的睡眠时间不足以让mysql数据库完成启动。
bash
# playedu\Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/node:20-alpine AS node-builder
COPY playedu-admin /app/admin
COPY playedu-pc /app/pc
COPY playedu-h5 /app/h5
WORKDIR /app/admin
RUN pnpm i && VITE_APP_URL=/api/ pnpm build
WORKDIR /app/pc
RUN pnpm i && VITE_APP_URL=/api/ pnpm build
WORKDIR /app/h5
RUN pnpm i && VITE_APP_URL=/api/ pnpm build
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS java-builder
COPY playedu-api /app
WORKDIR /app
RUN /app/mvnw -Dmaven.test.skip=true clean package
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS base
COPY --from=java-builder /app/playedu-api/target/playedu-api.jar /app/api/app.jar
COPY --from=node-builder /app/admin/dist /app/admin
COPY --from=node-builder /app/pc/dist /app/pc
COPY --from=node-builder /app/h5/dist /app/h5
COPY docker/nginx/conf/nginx.conf /etc/nginx/sites-enabled/default
EXPOSE 9898
EXPOSE 9800
EXPOSE 9801
EXPOSE 9900
# sleep 15 睡眠时间只有15秒,而数据库第一次启动需要大约3分钟以上,改成sleep 300后首次启动既可成功完成数据库初始化,项目运行正常
CMD nginx; echo "Waiting for MySQL to start..."; sleep 15; java -jar /app/api/app.jar --spring.profiles.active=prod --spring.datasource.url="jdbc:mysql://${DB_HOST}:${DB_PORT:-3306}/${DB_NAME}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" --spring.datasource.username=${DB_USER} --spring.datasource.password=${DB_PASS} --sa-token.is-concurrent=${SA_TOKEN_IS_CONCURRENT:-false} --sa-token.jwt-secret-key=${SA_TOKEN_JWT_SECRET_KEY}
这里是通过睡眠15秒等待mysql启动,实际上15秒不够,但是设成300秒又太多,有没有办法每隔3秒或者5秒检测mysql端口是否已开启,一旦开启就进行后续的程序启动,以下是解决方案(未验证)。