Merge branch 'master-jdk17' of https://gitee.com/zhijiantianya/ruoyi-vue-pro
# Conflicts: # README.md # pom.xml # yudao-dependencies/pom.xml # yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/app/file/AppFileController.java # yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java # yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImplTest.java # yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/notify/NotifyMessageServiceImplTest.java # yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImplTest.java
This commit is contained in:
commit
9f676fecfa
|
@ -0,0 +1,179 @@
|
||||||
|
--
|
||||||
|
-- A hint submitted by a user: Oracle DB MUST be created as "shared" and the
|
||||||
|
-- job_queue_processes parameter must be greater than 2
|
||||||
|
-- However, these settings are pretty much standard after any
|
||||||
|
-- Oracle install, so most users need not worry about this.
|
||||||
|
--
|
||||||
|
-- Many other users (including the primary author of Quartz) have had success
|
||||||
|
-- running in dedicated mode, so only consider the above as a hint ;-)
|
||||||
|
--
|
||||||
|
|
||||||
|
drop table if exists qrtz_calendars;
|
||||||
|
drop table if exists qrtz_fired_triggers;
|
||||||
|
drop table if exists qrtz_blob_triggers;
|
||||||
|
drop table if exists qrtz_cron_triggers;
|
||||||
|
drop table if exists qrtz_simple_triggers;
|
||||||
|
drop table if exists qrtz_simprop_triggers;
|
||||||
|
drop table if exists qrtz_triggers;
|
||||||
|
drop table if exists qrtz_job_details;
|
||||||
|
drop table if exists qrtz_paused_trigger_grps;
|
||||||
|
drop table if exists qrtz_locks;
|
||||||
|
drop table if exists qrtz_scheduler_state;
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_job_details
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
JOB_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
JOB_GROUP VARCHAR2(200) NOT NULL,
|
||||||
|
DESCRIPTION VARCHAR2(250) NULL,
|
||||||
|
JOB_CLASS_NAME VARCHAR2(250) NOT NULL,
|
||||||
|
IS_DURABLE VARCHAR2(1) NOT NULL,
|
||||||
|
IS_NONCONCURRENT VARCHAR2(1) NOT NULL,
|
||||||
|
IS_UPDATE_DATA VARCHAR2(1) NOT NULL,
|
||||||
|
REQUESTS_RECOVERY VARCHAR2(1) NOT NULL,
|
||||||
|
JOB_DATA BLOB NULL,
|
||||||
|
CONSTRAINT QRTZ_JOB_DETAILS_PK PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_triggers
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
TRIGGER_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
TRIGGER_GROUP VARCHAR2(200) NOT NULL,
|
||||||
|
JOB_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
JOB_GROUP VARCHAR2(200) NOT NULL,
|
||||||
|
DESCRIPTION VARCHAR2(250) NULL,
|
||||||
|
NEXT_FIRE_TIME NUMBER(19) NULL,
|
||||||
|
PREV_FIRE_TIME NUMBER(19) NULL,
|
||||||
|
PRIORITY NUMBER(13) NULL,
|
||||||
|
TRIGGER_STATE VARCHAR2(16) NOT NULL,
|
||||||
|
TRIGGER_TYPE VARCHAR2(8) NOT NULL,
|
||||||
|
START_TIME NUMBER(19) NOT NULL,
|
||||||
|
END_TIME NUMBER(19) NULL,
|
||||||
|
CALENDAR_NAME VARCHAR2(200) NULL,
|
||||||
|
MISFIRE_INSTR NUMBER(2) NULL,
|
||||||
|
JOB_DATA BLOB NULL,
|
||||||
|
CONSTRAINT QRTZ_TRIGGERS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
|
||||||
|
CONSTRAINT QRTZ_TRIGGER_TO_JOBS_FK FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
|
||||||
|
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_simple_triggers
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
TRIGGER_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
TRIGGER_GROUP VARCHAR2(200) NOT NULL,
|
||||||
|
REPEAT_COUNT NUMBER(7) NOT NULL,
|
||||||
|
REPEAT_INTERVAL NUMBER(12) NOT NULL,
|
||||||
|
TIMES_TRIGGERED NUMBER(10) NOT NULL,
|
||||||
|
CONSTRAINT QRTZ_SIMPLE_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
|
||||||
|
CONSTRAINT QRTZ_SIMPLE_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
|
||||||
|
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_cron_triggers
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
TRIGGER_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
TRIGGER_GROUP VARCHAR2(200) NOT NULL,
|
||||||
|
CRON_EXPRESSION VARCHAR2(120) NOT NULL,
|
||||||
|
TIME_ZONE_ID VARCHAR2(80),
|
||||||
|
CONSTRAINT QRTZ_CRON_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
|
||||||
|
CONSTRAINT QRTZ_CRON_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
|
||||||
|
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_simprop_triggers
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
TRIGGER_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
TRIGGER_GROUP VARCHAR2(200) NOT NULL,
|
||||||
|
STR_PROP_1 VARCHAR2(512) NULL,
|
||||||
|
STR_PROP_2 VARCHAR2(512) NULL,
|
||||||
|
STR_PROP_3 VARCHAR2(512) NULL,
|
||||||
|
INT_PROP_1 NUMBER(10) NULL,
|
||||||
|
INT_PROP_2 NUMBER(10) NULL,
|
||||||
|
LONG_PROP_1 NUMBER(19) NULL,
|
||||||
|
LONG_PROP_2 NUMBER(19) NULL,
|
||||||
|
DEC_PROP_1 NUMERIC(13,4) NULL,
|
||||||
|
DEC_PROP_2 NUMERIC(13,4) NULL,
|
||||||
|
BOOL_PROP_1 VARCHAR2(1) NULL,
|
||||||
|
BOOL_PROP_2 VARCHAR2(1) NULL,
|
||||||
|
TIME_ZONE_ID VARCHAR2(80) NULL,
|
||||||
|
CONSTRAINT QRTZ_SIMPROP_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
|
||||||
|
CONSTRAINT QRTZ_SIMPROP_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
|
||||||
|
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_blob_triggers
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
TRIGGER_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
TRIGGER_GROUP VARCHAR2(200) NOT NULL,
|
||||||
|
BLOB_DATA BLOB NULL,
|
||||||
|
CONSTRAINT QRTZ_BLOB_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
|
||||||
|
CONSTRAINT QRTZ_BLOB_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
|
||||||
|
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_calendars
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
CALENDAR_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
CALENDAR BLOB NOT NULL,
|
||||||
|
CONSTRAINT QRTZ_CALENDARS_PK PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_paused_trigger_grps
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
TRIGGER_GROUP VARCHAR2(200) NOT NULL,
|
||||||
|
CONSTRAINT QRTZ_PAUSED_TRIG_GRPS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_fired_triggers
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
ENTRY_ID VARCHAR2(140) NOT NULL,
|
||||||
|
TRIGGER_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
TRIGGER_GROUP VARCHAR2(200) NOT NULL,
|
||||||
|
INSTANCE_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
FIRED_TIME NUMBER(19) NOT NULL,
|
||||||
|
SCHED_TIME NUMBER(19) NOT NULL,
|
||||||
|
PRIORITY NUMBER(13) NOT NULL,
|
||||||
|
STATE VARCHAR2(16) NOT NULL,
|
||||||
|
JOB_NAME VARCHAR2(200) NULL,
|
||||||
|
JOB_GROUP VARCHAR2(200) NULL,
|
||||||
|
IS_NONCONCURRENT VARCHAR2(1) NULL,
|
||||||
|
REQUESTS_RECOVERY VARCHAR2(1) NULL,
|
||||||
|
CONSTRAINT QRTZ_FIRED_TRIGGER_PK PRIMARY KEY (SCHED_NAME,ENTRY_ID)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_scheduler_state
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
INSTANCE_NAME VARCHAR2(200) NOT NULL,
|
||||||
|
LAST_CHECKIN_TIME NUMBER(19) NOT NULL,
|
||||||
|
CHECKIN_INTERVAL NUMBER(13) NOT NULL,
|
||||||
|
CONSTRAINT QRTZ_SCHEDULER_STATE_PK PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
|
||||||
|
);
|
||||||
|
CREATE TABLE qrtz_locks
|
||||||
|
(
|
||||||
|
SCHED_NAME VARCHAR2(120) NOT NULL,
|
||||||
|
LOCK_NAME VARCHAR2(40) NOT NULL,
|
||||||
|
CONSTRAINT QRTZ_LOCKS_PK PRIMARY KEY (SCHED_NAME,LOCK_NAME)
|
||||||
|
);
|
||||||
|
|
||||||
|
create index idx_qrtz_j_req_recovery on qrtz_job_details(SCHED_NAME,REQUESTS_RECOVERY);
|
||||||
|
create index idx_qrtz_j_grp on qrtz_job_details(SCHED_NAME,JOB_GROUP);
|
||||||
|
|
||||||
|
create index idx_qrtz_t_j on qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
|
||||||
|
create index idx_qrtz_t_jg on qrtz_triggers(SCHED_NAME,JOB_GROUP);
|
||||||
|
create index idx_qrtz_t_c on qrtz_triggers(SCHED_NAME,CALENDAR_NAME);
|
||||||
|
create index idx_qrtz_t_g on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP);
|
||||||
|
create index idx_qrtz_t_state on qrtz_triggers(SCHED_NAME,TRIGGER_STATE);
|
||||||
|
create index idx_qrtz_t_n_state on qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
|
||||||
|
create index idx_qrtz_t_n_g_state on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
|
||||||
|
create index idx_qrtz_t_next_fire_time on qrtz_triggers(SCHED_NAME,NEXT_FIRE_TIME);
|
||||||
|
create index idx_qrtz_t_nft_st on qrtz_triggers(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
|
||||||
|
create index idx_qrtz_t_nft_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
|
||||||
|
create index idx_qrtz_t_nft_st_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
|
||||||
|
create index idx_qrtz_t_nft_st_misfire_grp on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
|
||||||
|
|
||||||
|
create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME);
|
||||||
|
create index idx_qrtz_ft_inst_job_req_rcvry on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
|
||||||
|
create index idx_qrtz_ft_j_g on qrtz_fired_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
|
||||||
|
create index idx_qrtz_ft_jg on qrtz_fired_triggers(SCHED_NAME,JOB_GROUP);
|
||||||
|
create index idx_qrtz_ft_t_g on qrtz_fired_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
|
||||||
|
create index idx_qrtz_ft_tg on qrtz_fired_triggers(SCHED_NAME,TRIGGER_GROUP);
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,170 @@
|
||||||
|
set client_min_messages = WARNING;
|
||||||
|
DROP TABLE IF EXISTS qrtz_fired_triggers;
|
||||||
|
DROP TABLE IF EXISTS qrtz_paused_trigger_grps;
|
||||||
|
DROP TABLE IF EXISTS qrtz_scheduler_state;
|
||||||
|
DROP TABLE IF EXISTS qrtz_locks;
|
||||||
|
DROP TABLE IF EXISTS qrtz_simprop_triggers;
|
||||||
|
DROP TABLE IF EXISTS qrtz_simple_triggers;
|
||||||
|
DROP TABLE IF EXISTS qrtz_cron_triggers;
|
||||||
|
DROP TABLE IF EXISTS qrtz_blob_triggers;
|
||||||
|
DROP TABLE IF EXISTS qrtz_triggers;
|
||||||
|
DROP TABLE IF EXISTS qrtz_job_details;
|
||||||
|
DROP TABLE IF EXISTS qrtz_calendars;
|
||||||
|
set client_min_messages = NOTICE;
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_job_details
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
job_name TEXT NOT NULL,
|
||||||
|
job_group TEXT NOT NULL,
|
||||||
|
description TEXT NULL,
|
||||||
|
job_class_name TEXT NOT NULL,
|
||||||
|
is_durable BOOL NOT NULL,
|
||||||
|
is_nonconcurrent BOOL NOT NULL,
|
||||||
|
is_update_data BOOL NOT NULL,
|
||||||
|
requests_recovery BOOL NOT NULL,
|
||||||
|
job_data BYTEA NULL,
|
||||||
|
PRIMARY KEY (sched_name,job_name,job_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_triggers
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
trigger_name TEXT NOT NULL,
|
||||||
|
trigger_group TEXT NOT NULL,
|
||||||
|
job_name TEXT NOT NULL,
|
||||||
|
job_group TEXT NOT NULL,
|
||||||
|
description TEXT NULL,
|
||||||
|
next_fire_time BIGINT NULL,
|
||||||
|
prev_fire_time BIGINT NULL,
|
||||||
|
priority INTEGER NULL,
|
||||||
|
trigger_state TEXT NOT NULL,
|
||||||
|
trigger_type TEXT NOT NULL,
|
||||||
|
start_time BIGINT NOT NULL,
|
||||||
|
end_time BIGINT NULL,
|
||||||
|
calendar_name TEXT NULL,
|
||||||
|
misfire_instr SMALLINT NULL,
|
||||||
|
job_data BYTEA NULL,
|
||||||
|
PRIMARY KEY (sched_name,trigger_name,trigger_group),
|
||||||
|
FOREIGN KEY (sched_name,job_name,job_group)
|
||||||
|
REFERENCES qrtz_job_details(sched_name,job_name,job_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_simple_triggers
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
trigger_name TEXT NOT NULL,
|
||||||
|
trigger_group TEXT NOT NULL,
|
||||||
|
repeat_count BIGINT NOT NULL,
|
||||||
|
repeat_interval BIGINT NOT NULL,
|
||||||
|
times_triggered BIGINT NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name,trigger_name,trigger_group),
|
||||||
|
FOREIGN KEY (sched_name,trigger_name,trigger_group)
|
||||||
|
REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
trigger_name TEXT NOT NULL ,
|
||||||
|
trigger_group TEXT NOT NULL ,
|
||||||
|
str_prop_1 TEXT NULL,
|
||||||
|
str_prop_2 TEXT NULL,
|
||||||
|
str_prop_3 TEXT NULL,
|
||||||
|
int_prop_1 INTEGER NULL,
|
||||||
|
int_prop_2 INTEGER NULL,
|
||||||
|
long_prop_1 BIGINT NULL,
|
||||||
|
long_prop_2 BIGINT NULL,
|
||||||
|
dec_prop_1 NUMERIC NULL,
|
||||||
|
dec_prop_2 NUMERIC NULL,
|
||||||
|
bool_prop_1 BOOL NULL,
|
||||||
|
bool_prop_2 BOOL NULL,
|
||||||
|
time_zone_id TEXT NULL,
|
||||||
|
PRIMARY KEY (sched_name,trigger_name,trigger_group),
|
||||||
|
FOREIGN KEY (sched_name,trigger_name,trigger_group)
|
||||||
|
REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_cron_triggers
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
trigger_name TEXT NOT NULL,
|
||||||
|
trigger_group TEXT NOT NULL,
|
||||||
|
cron_expression TEXT NOT NULL,
|
||||||
|
time_zone_id TEXT,
|
||||||
|
PRIMARY KEY (sched_name,trigger_name,trigger_group),
|
||||||
|
FOREIGN KEY (sched_name,trigger_name,trigger_group)
|
||||||
|
REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_blob_triggers
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
trigger_name TEXT NOT NULL,
|
||||||
|
trigger_group TEXT NOT NULL,
|
||||||
|
blob_data BYTEA NULL,
|
||||||
|
PRIMARY KEY (sched_name,trigger_name,trigger_group),
|
||||||
|
FOREIGN KEY (sched_name,trigger_name,trigger_group)
|
||||||
|
REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_calendars
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
calendar_name TEXT NOT NULL,
|
||||||
|
calendar BYTEA NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name,calendar_name)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_paused_trigger_grps
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
trigger_group TEXT NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name,trigger_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_fired_triggers
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
entry_id TEXT NOT NULL,
|
||||||
|
trigger_name TEXT NOT NULL,
|
||||||
|
trigger_group TEXT NOT NULL,
|
||||||
|
instance_name TEXT NOT NULL,
|
||||||
|
fired_time BIGINT NOT NULL,
|
||||||
|
sched_time BIGINT NOT NULL,
|
||||||
|
priority INTEGER NOT NULL,
|
||||||
|
state TEXT NOT NULL,
|
||||||
|
job_name TEXT NULL,
|
||||||
|
job_group TEXT NULL,
|
||||||
|
is_nonconcurrent BOOL NOT NULL,
|
||||||
|
requests_recovery BOOL NULL,
|
||||||
|
PRIMARY KEY (sched_name,entry_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_scheduler_state
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
instance_name TEXT NOT NULL,
|
||||||
|
last_checkin_time BIGINT NOT NULL,
|
||||||
|
checkin_interval BIGINT NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name,instance_name)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE qrtz_locks
|
||||||
|
(
|
||||||
|
sched_name TEXT NOT NULL,
|
||||||
|
lock_name TEXT NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name,lock_name)
|
||||||
|
);
|
||||||
|
|
||||||
|
create index idx_qrtz_j_req_recovery on qrtz_job_details(requests_recovery);
|
||||||
|
create index idx_qrtz_t_next_fire_time on qrtz_triggers(next_fire_time);
|
||||||
|
create index idx_qrtz_t_state on qrtz_triggers(trigger_state);
|
||||||
|
create index idx_qrtz_t_nft_st on qrtz_triggers(next_fire_time,trigger_state);
|
||||||
|
create index idx_qrtz_ft_trig_name on qrtz_fired_triggers(trigger_name);
|
||||||
|
create index idx_qrtz_ft_trig_group on qrtz_fired_triggers(trigger_group);
|
||||||
|
create index idx_qrtz_ft_trig_nm_gp on qrtz_fired_triggers(sched_name,trigger_name,trigger_group);
|
||||||
|
create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(instance_name);
|
||||||
|
create index idx_qrtz_ft_job_name on qrtz_fired_triggers(job_name);
|
||||||
|
create index idx_qrtz_ft_job_group on qrtz_fired_triggers(job_group);
|
||||||
|
create index idx_qrtz_ft_job_req_recovery on qrtz_fired_triggers(requests_recovery);
|
|
@ -0,0 +1,253 @@
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_blob_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_blob_triggers
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
trigger_name varchar(190) NOT NULL,
|
||||||
|
trigger_group varchar(190) NOT NULL,
|
||||||
|
blob_data bytea NULL,
|
||||||
|
PRIMARY KEY (sched_name, trigger_name, trigger_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX idx_qrtz_blob_triggers_sched_name ON qrtz_blob_triggers (sched_name, trigger_name, trigger_group);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_calendars
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_calendars
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
calendar_name varchar(190) NOT NULL,
|
||||||
|
calendar bytea NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name, calendar_name)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_cron_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_cron_triggers
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
trigger_name varchar(190) NOT NULL,
|
||||||
|
trigger_group varchar(190) NOT NULL,
|
||||||
|
cron_expression varchar(120) NOT NULL,
|
||||||
|
time_zone_id varchar(80) NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (sched_name, trigger_name, trigger_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- @formatter:off
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
-- @formatter:on
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_fired_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_fired_triggers
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
entry_id varchar(95) NOT NULL,
|
||||||
|
trigger_name varchar(190) NOT NULL,
|
||||||
|
trigger_group varchar(190) NOT NULL,
|
||||||
|
instance_name varchar(190) NOT NULL,
|
||||||
|
fired_time int8 NOT NULL,
|
||||||
|
sched_time int8 NOT NULL,
|
||||||
|
priority int4 NOT NULL,
|
||||||
|
state varchar(16) NOT NULL,
|
||||||
|
job_name varchar(190) NULL DEFAULT NULL,
|
||||||
|
job_group varchar(190) NULL DEFAULT NULL,
|
||||||
|
is_nonconcurrent varchar(1) NULL DEFAULT NULL,
|
||||||
|
requests_recovery varchar(1) NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (sched_name, entry_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX idx_qrtz_ft_trig_inst_name ON qrtz_fired_triggers (sched_name, instance_name);
|
||||||
|
CREATE INDEX idx_qrtz_ft_inst_job_req_rcvry ON qrtz_fired_triggers (sched_name, instance_name, requests_recovery);
|
||||||
|
CREATE INDEX idx_qrtz_ft_j_g ON qrtz_fired_triggers (sched_name, job_name, job_group);
|
||||||
|
CREATE INDEX idx_qrtz_ft_jg ON qrtz_fired_triggers (sched_name, job_group);
|
||||||
|
CREATE INDEX idx_qrtz_ft_t_g ON qrtz_fired_triggers (sched_name, trigger_name, trigger_group);
|
||||||
|
CREATE INDEX idx_qrtz_ft_tg ON qrtz_fired_triggers (sched_name, trigger_group);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_job_details
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_job_details
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
job_name varchar(190) NOT NULL,
|
||||||
|
job_group varchar(190) NOT NULL,
|
||||||
|
description varchar(250) NULL DEFAULT NULL,
|
||||||
|
job_class_name varchar(250) NOT NULL,
|
||||||
|
is_durable varchar(1) NOT NULL,
|
||||||
|
is_nonconcurrent varchar(1) NOT NULL,
|
||||||
|
is_update_data varchar(1) NOT NULL,
|
||||||
|
requests_recovery varchar(1) NOT NULL,
|
||||||
|
job_data bytea NULL,
|
||||||
|
PRIMARY KEY (sched_name, job_name, job_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX idx_qrtz_j_req_recovery ON qrtz_job_details (sched_name, requests_recovery);
|
||||||
|
CREATE INDEX idx_qrtz_j_grp ON qrtz_job_details (sched_name, job_group);
|
||||||
|
|
||||||
|
-- @formatter:off
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
-- @formatter:on
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_locks
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_locks
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
lock_name varchar(40) NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name, lock_name)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- @formatter:off
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
-- @formatter:on
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_paused_trigger_grps
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_paused_trigger_grps
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
trigger_group varchar(190) NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name, trigger_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_scheduler_state
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_scheduler_state
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
instance_name varchar(190) NOT NULL,
|
||||||
|
last_checkin_time int8 NOT NULL,
|
||||||
|
checkin_interval int8 NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name, instance_name)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- @formatter:off
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
-- @formatter:on
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_simple_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_simple_triggers
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
trigger_name varchar(190) NOT NULL,
|
||||||
|
trigger_group varchar(190) NOT NULL,
|
||||||
|
repeat_count int8 NOT NULL,
|
||||||
|
repeat_interval int8 NOT NULL,
|
||||||
|
times_triggered int8 NOT NULL,
|
||||||
|
PRIMARY KEY (sched_name, trigger_name, trigger_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_simprop_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_simprop_triggers
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
trigger_name varchar(190) NOT NULL,
|
||||||
|
trigger_group varchar(190) NOT NULL,
|
||||||
|
str_prop_1 varchar(512) NULL DEFAULT NULL,
|
||||||
|
str_prop_2 varchar(512) NULL DEFAULT NULL,
|
||||||
|
str_prop_3 varchar(512) NULL DEFAULT NULL,
|
||||||
|
int_prop_1 int4 NULL DEFAULT NULL,
|
||||||
|
int_prop_2 int4 NULL DEFAULT NULL,
|
||||||
|
long_prop_1 int8 NULL DEFAULT NULL,
|
||||||
|
long_prop_2 int8 NULL DEFAULT NULL,
|
||||||
|
dec_prop_1 numeric(13, 4) NULL DEFAULT NULL,
|
||||||
|
dec_prop_2 numeric(13, 4) NULL DEFAULT NULL,
|
||||||
|
bool_prop_1 varchar(1) NULL DEFAULT NULL,
|
||||||
|
bool_prop_2 varchar(1) NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (sched_name, trigger_name, trigger_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- qrtz_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
CREATE TABLE qrtz_triggers
|
||||||
|
(
|
||||||
|
sched_name varchar(120) NOT NULL,
|
||||||
|
trigger_name varchar(190) NOT NULL,
|
||||||
|
trigger_group varchar(190) NOT NULL,
|
||||||
|
job_name varchar(190) NOT NULL,
|
||||||
|
job_group varchar(190) NOT NULL,
|
||||||
|
description varchar(250) NULL DEFAULT NULL,
|
||||||
|
next_fire_time int8 NULL DEFAULT NULL,
|
||||||
|
prev_fire_time int8 NULL DEFAULT NULL,
|
||||||
|
priority int4 NULL DEFAULT NULL,
|
||||||
|
trigger_state varchar(16) NOT NULL,
|
||||||
|
trigger_type varchar(8) NOT NULL,
|
||||||
|
start_time int8 NOT NULL,
|
||||||
|
end_time int8 NULL DEFAULT NULL,
|
||||||
|
calendar_name varchar(190) NULL DEFAULT NULL,
|
||||||
|
misfire_instr int2 NULL DEFAULT NULL,
|
||||||
|
job_data bytea NULL,
|
||||||
|
PRIMARY KEY (sched_name, trigger_name, trigger_group)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX idx_qrtz_t_j ON qrtz_triggers (sched_name, job_name, job_group);
|
||||||
|
CREATE INDEX idx_qrtz_t_jg ON qrtz_triggers (sched_name, job_group);
|
||||||
|
CREATE INDEX idx_qrtz_t_c ON qrtz_triggers (sched_name, calendar_name);
|
||||||
|
CREATE INDEX idx_qrtz_t_g ON qrtz_triggers (sched_name, trigger_group);
|
||||||
|
CREATE INDEX idx_qrtz_t_state ON qrtz_triggers (sched_name, trigger_state);
|
||||||
|
CREATE INDEX idx_qrtz_t_n_state ON qrtz_triggers (sched_name, trigger_name, trigger_group, trigger_state);
|
||||||
|
CREATE INDEX idx_qrtz_t_n_g_state ON qrtz_triggers (sched_name, trigger_group, trigger_state);
|
||||||
|
CREATE INDEX idx_qrtz_t_next_fire_time ON qrtz_triggers (sched_name, next_fire_time);
|
||||||
|
CREATE INDEX idx_qrtz_t_nft_st ON qrtz_triggers (sched_name, trigger_state, next_fire_time);
|
||||||
|
CREATE INDEX idx_qrtz_t_nft_misfire ON qrtz_triggers (sched_name, misfire_instr, next_fire_time);
|
||||||
|
CREATE INDEX idx_qrtz_t_nft_st_misfire ON qrtz_triggers (sched_name, misfire_instr, next_fire_time, trigger_state);
|
||||||
|
CREATE INDEX idx_qrtz_t_nft_st_misfire_grp ON qrtz_triggers (sched_name, misfire_instr, next_fire_time, trigger_group,
|
||||||
|
trigger_state);
|
||||||
|
|
||||||
|
-- @formatter:off
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
-- @formatter:on
|
||||||
|
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- FK: qrtz_blob_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
ALTER TABLE qrtz_blob_triggers
|
||||||
|
ADD CONSTRAINT qrtz_blob_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name,
|
||||||
|
trigger_name,
|
||||||
|
trigger_group);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- FK: qrtz_cron_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
ALTER TABLE qrtz_cron_triggers
|
||||||
|
ADD CONSTRAINT qrtz_cron_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- FK: qrtz_simple_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
ALTER TABLE qrtz_simple_triggers
|
||||||
|
ADD CONSTRAINT qrtz_simple_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name,
|
||||||
|
trigger_name,
|
||||||
|
trigger_group);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- FK: qrtz_simprop_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
ALTER TABLE qrtz_simprop_triggers
|
||||||
|
ADD CONSTRAINT qrtz_simprop_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- FK: qrtz_triggers
|
||||||
|
-- ----------------------------
|
||||||
|
ALTER TABLE qrtz_triggers
|
||||||
|
ADD CONSTRAINT qrtz_triggers_ibfk_1 FOREIGN KEY (sched_name, job_name, job_group) REFERENCES qrtz_job_details (sched_name, job_name, job_group);
|
|
@ -19,10 +19,14 @@ docker compose up -d mysql
|
||||||
#### 1.2 Oracle
|
#### 1.2 Oracle
|
||||||
|
|
||||||
```Bash
|
```Bash
|
||||||
|
## x86 版本
|
||||||
docker compose up -d oracle
|
docker compose up -d oracle
|
||||||
|
|
||||||
|
## MacBook Apple Silicon
|
||||||
|
docker compose up -d oracle_m1
|
||||||
```
|
```
|
||||||
|
|
||||||
暂不支持 MacBook Apple Silicon,因为 Oracle 官方没有提供 Apple Silicon 版本的 Docker 镜像。
|
> 注意:如果使用 MacBook Apple Silicon 版本,它的 ORACLE_SID 不是 XE,而是 FREE!!!
|
||||||
|
|
||||||
### 1.3 PostgreSQL
|
### 1.3 PostgreSQL
|
||||||
|
|
||||||
|
@ -38,16 +42,14 @@ docker compose up -d sqlserver
|
||||||
docker compose exec sqlserver bash /tmp/create_schema.sh
|
docker compose exec sqlserver bash /tmp/create_schema.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
暂不支持 MacBook Apple Silicon,因为 SQL Server 官方没有提供 Apple Silicon 版本的 Docker 镜像。
|
|
||||||
|
|
||||||
### 1.5 DM 达梦
|
### 1.5 DM 达梦
|
||||||
|
|
||||||
① 下载达梦 Docker 镜像:https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar
|
① 下载达梦 Docker 镜像:<https://eco.dameng.com/download/> 地址,点击“Docker 镜像”选项,进行下载。
|
||||||
|
|
||||||
② 加载镜像文件,在镜像 tar 文件所在目录运行:
|
② 加载镜像文件,在镜像 tar 文件所在目录运行:
|
||||||
|
|
||||||
```Bash
|
```Bash
|
||||||
docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
|
docker load -i dm8_20240715_x86_rh6_rq_single.tar
|
||||||
```
|
```
|
||||||
|
|
||||||
③ 在项目 `sql/tools` 目录下运行:
|
③ 在项目 `sql/tools` 目录下运行:
|
||||||
|
@ -59,22 +61,17 @@ docker compose exec dm8 bash -c '/opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/s
|
||||||
exit
|
exit
|
||||||
```
|
```
|
||||||
|
|
||||||
**注意**: `sql/dm/ruoyi-vue-pro-dm8.sql` 文件编码必须为 `GBK` 或者 `GBK` 超集,否则会出现中文乱码。
|
|
||||||
|
|
||||||
暂不支持 MacBook Apple Silicon,因为 达梦 官方没有提供 Apple Silicon 版本的 Docker 镜像。
|
|
||||||
|
|
||||||
### 1.6 KingbaseES 人大金仓
|
### 1.6 KingbaseES 人大金仓
|
||||||
|
|
||||||
① 下载人大金仓 Docker 镜像:
|
① 下载人大金仓 Docker 镜像:
|
||||||
|
|
||||||
> x86_64 版本: https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/x86_64/kdb_x86_64_V009R001C001B0025.tar
|
* [x86_64 版本](https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/x86_64/kdb_x86_64_V009R001C001B0025.tar) 【Windows 选择这个】
|
||||||
|
* [aarch64 版本](https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/aarch64/kdb_aarch64_V009R001C001B0025.tar) 【MacBook Apple Silicon 选择这个】
|
||||||
> aarch64 版本:https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/aarch64/kdb_aarch64_V009R001C001B0025.tar
|
|
||||||
|
|
||||||
② 加载镜像文件,在镜像 tar 文件所在目录运行:
|
② 加载镜像文件,在镜像 tar 文件所在目录运行:
|
||||||
|
|
||||||
```Bash
|
```Bash
|
||||||
docker load -i x86_64/kdb_x86_64_V009R001C001B0025.tar
|
docker load -i kdb_x86_64_V009R001C001B0025.tar
|
||||||
```
|
```
|
||||||
|
|
||||||
③ 在项目 `sql/tools` 目录下运行:
|
③ 在项目 `sql/tools` 目录下运行:
|
||||||
|
@ -106,9 +103,11 @@ docker volume rm ruoyi-vue-pro_postgres
|
||||||
|
|
||||||
## 2. MySQL 转换其它数据库
|
## 2. MySQL 转换其它数据库
|
||||||
|
|
||||||
|
项目提供了 `sql/tools/convertor.py` 脚本,支持将 MySQL 转换为 Oracle、PostgreSQL、SQL Server、达梦、人大金仓、OpenGauss 等数据库的脚本。
|
||||||
|
|
||||||
### 2.1 实现原理
|
### 2.1 实现原理
|
||||||
|
|
||||||
通过读取 MySQL 的 `sql/mysql/ruoyi-vue-pro.sql` 数据库文件,转换成 Oracle、PostgreSQL、SQL Server、达梦、人大金仓 等数据库的脚本。
|
通过读取 MySQL 的 `sql/mysql/ruoyi-vue-pro.sql` 数据库文件,转换成对应的数据库脚本。
|
||||||
|
|
||||||
### 2.2 使用方法
|
### 2.2 使用方法
|
||||||
|
|
||||||
|
@ -119,7 +118,7 @@ pip install simple-ddl-parser
|
||||||
# pip3 install simple-ddl-parser
|
# pip3 install simple-ddl-parser
|
||||||
```
|
```
|
||||||
|
|
||||||
② 执行如下命令打印生成 postgres 的脚本内容,其他可选参数有:`oracle`、`sqlserver`、`dm8`、`kingbase`:
|
② 在 `sql/tools/` 目录下,执行如下命令打印生成 postgres 的脚本内容,其他可选参数有:`oracle`、`sqlserver`、`dm8`、`kingbase`、`opengauss`:
|
||||||
|
|
||||||
```Bash
|
```Bash
|
||||||
python3 convertor.py postgres
|
python3 convertor.py postgres
|
||||||
|
|
|
@ -58,6 +58,20 @@ services:
|
||||||
- ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro
|
- ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro
|
||||||
- ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro
|
- ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro
|
||||||
|
|
||||||
|
oracle_m1:
|
||||||
|
image: einslib/oracle-19c:19.3.0-ee-slim-faststart
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
## 登录信息 SID: FREE user: system password: oracle
|
||||||
|
ORACLE_PASSWORD: oracle
|
||||||
|
ports:
|
||||||
|
- "1521:1521"
|
||||||
|
volumes:
|
||||||
|
- ../oracle/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
|
||||||
|
# 创建app用户: ROOT/123456@//localhost/XEPDB1
|
||||||
|
- ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro
|
||||||
|
- ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro
|
||||||
|
|
||||||
sqlserver:
|
sqlserver:
|
||||||
image: mcr.microsoft.com/mssql/server:2017-latest
|
image: mcr.microsoft.com/mssql/server:2017-latest
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
@ -73,11 +87,9 @@ services:
|
||||||
# docker compose exec sqlserver bash /tmp/create_schema.sh
|
# docker compose exec sqlserver bash /tmp/create_schema.sh
|
||||||
- ./sqlserver/create_schema.sh:/tmp/create_schema.sh:ro
|
- ./sqlserver/create_schema.sh:/tmp/create_schema.sh:ro
|
||||||
|
|
||||||
|
|
||||||
dm8:
|
dm8:
|
||||||
# wget https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar
|
# docker load -i dm8_20240715_x86_rh6_rq_single.tar
|
||||||
# docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
|
image: dm8_single:dm8_20240715_rev232765_x86_rh6_64
|
||||||
image: dm8_single:dm8_20230808_rev197096_x86_rh6_64
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
PAGE_SIZE: 16
|
PAGE_SIZE: 16
|
||||||
|
@ -93,13 +105,10 @@ services:
|
||||||
volumes:
|
volumes:
|
||||||
- dm8:/opt/dmdbms/data
|
- dm8:/opt/dmdbms/data
|
||||||
- ../dm/ruoyi-vue-pro-dm8.sql:/tmp/schema.sql:ro
|
- ../dm/ruoyi-vue-pro-dm8.sql:/tmp/schema.sql:ro
|
||||||
# docker compose exec dm8 bash -c '/opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/schema.sql'
|
|
||||||
|
|
||||||
kingbase:
|
kingbase:
|
||||||
# x86_64: https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/x86_64/kdb_x86_64_V009R001C001B0025.tar
|
|
||||||
# aarch64: https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/aarch64/kdb_aarch64_V009R001C001B0025.tar
|
|
||||||
# docker load -i kdb_x86_64_V009R001C001B0025.tar
|
|
||||||
image: kingbase_v009r001c001b0025_single_x86:v1
|
image: kingbase_v009r001c001b0025_single_x86:v1
|
||||||
|
# image: kingbase_v009r001c001b0025_single_arm:v1
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
DB_USER: root
|
DB_USER: root
|
||||||
|
@ -109,7 +118,6 @@ services:
|
||||||
volumes:
|
volumes:
|
||||||
- kingbase:/home/kingbase/userdata
|
- kingbase:/home/kingbase/userdata
|
||||||
- ../kingbase/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
|
- ../kingbase/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
|
||||||
# docker compose exec kingbase bash -c 'ksql -U $DB_USER -d test -f /tmp/schema.sql'
|
|
||||||
|
|
||||||
opengauss:
|
opengauss:
|
||||||
image: opengauss/opengauss:5.0.0
|
image: opengauss/opengauss:5.0.0
|
||||||
|
|
|
@ -2,7 +2,6 @@ package cn.iocoder.yudao.framework.mybatis.config;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
|
import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
|
import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
|
||||||
import com.baomidou.mybatisplus.annotation.DbType;
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
@ -42,9 +41,6 @@ public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor
|
||||||
// TODO 芋艿:暂时没有找到特别合适的地方,先放在这里
|
// TODO 芋艿:暂时没有找到特别合适的地方,先放在这里
|
||||||
setJobStoreDriverIfPresent(environment, dbType);
|
setJobStoreDriverIfPresent(environment, dbType);
|
||||||
|
|
||||||
// 初始化 SQL 静态变量
|
|
||||||
SqlConstants.init(dbType);
|
|
||||||
|
|
||||||
// 如果非 NONE,则不进行处理
|
// 如果非 NONE,则不进行处理
|
||||||
IdType idType = getIdType(environment);
|
IdType idType = getIdType(environment);
|
||||||
if (idType != IdType.NONE) {
|
if (idType != IdType.NONE) {
|
||||||
|
@ -55,7 +51,7 @@ public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor
|
||||||
setIdType(environment, IdType.INPUT);
|
setIdType(environment, IdType.INPUT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 情况二,自增 ID,适合 MySQL 等直接自增的数据库
|
// 情况二,自增 ID,适合 MySQL、DM 达梦等直接自增的数据库
|
||||||
setIdType(environment, IdType.AUTO);
|
setIdType(environment, IdType.AUTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +82,10 @@ public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor
|
||||||
case SQL_SERVER2005:
|
case SQL_SERVER2005:
|
||||||
driverClass = "org.quartz.impl.jdbcjobstore.MSSQLDelegate";
|
driverClass = "org.quartz.impl.jdbcjobstore.MSSQLDelegate";
|
||||||
break;
|
break;
|
||||||
|
case DM:
|
||||||
|
case KINGBASE_ES:
|
||||||
|
driverClass = "org.quartz.impl.jdbcjobstore.StdJDBCDelegate";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
// 设置 driverClass 变量
|
// 设置 driverClass 变量
|
||||||
if (StrUtil.isNotEmpty(driverClass)) {
|
if (StrUtil.isNotEmpty(driverClass)) {
|
||||||
|
|
|
@ -18,10 +18,17 @@ import java.util.stream.Collectors;
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum DbTypeEnum {
|
public enum DbTypeEnum {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* H2
|
||||||
|
*
|
||||||
|
* 注意:H2 不支持 find_in_set 函数
|
||||||
|
*/
|
||||||
|
H2(DbType.H2, "H2", ""),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MySQL
|
* MySQL
|
||||||
*/
|
*/
|
||||||
MY_SQL( DbType.MYSQL, "MySQL", "FIND_IN_SET('#{value}', #{column}) <> 0"),
|
MY_SQL(DbType.MYSQL, "MySQL", "FIND_IN_SET('#{value}', #{column}) <> 0"),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Oracle
|
* Oracle
|
||||||
|
@ -39,6 +46,10 @@ public enum DbTypeEnum {
|
||||||
* SQL Server
|
* SQL Server
|
||||||
*/
|
*/
|
||||||
SQL_SERVER(DbType.SQL_SERVER, "Microsoft SQL Server", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0"),
|
SQL_SERVER(DbType.SQL_SERVER, "Microsoft SQL Server", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0"),
|
||||||
|
/**
|
||||||
|
* SQL Server 2005
|
||||||
|
*/
|
||||||
|
SQL_SERVER2005(DbType.SQL_SERVER2005, "Microsoft SQL Server 2005", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0"),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 达梦
|
* 达梦
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
package cn.iocoder.yudao.framework.mybatis.core.enums;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.DbType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SQL相关常量类
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
public class SqlConstants {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 数据库的类型
|
|
||||||
*/
|
|
||||||
public static DbType DB_TYPE;
|
|
||||||
|
|
||||||
public static void init(DbType dbType) {
|
|
||||||
DB_TYPE = dbType;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
|
import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.SortingField;
|
import cn.iocoder.yudao.framework.common.pojo.SortingField;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
|
import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||||
import com.baomidou.mybatisplus.annotation.DbType;
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
|
@ -22,7 +22,6 @@ import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力
|
* 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力
|
||||||
|
@ -135,11 +134,6 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
|
||||||
return selectList(new LambdaQueryWrapper<T>().in(field, values));
|
return selectList(new LambdaQueryWrapper<T>().in(field, values));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
default List<T> selectList(SFunction<T, ?> leField, SFunction<T, ?> geField, Object value) {
|
|
||||||
return selectList(new LambdaQueryWrapper<T>().le(leField, value).ge(geField, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
default List<T> selectList(SFunction<T, ?> field1, Object value1, SFunction<T, ?> field2, Object value2) {
|
default List<T> selectList(SFunction<T, ?> field1, Object value1, SFunction<T, ?> field2, Object value2) {
|
||||||
return selectList(new LambdaQueryWrapper<T>().eq(field1, value1).eq(field2, value2));
|
return selectList(new LambdaQueryWrapper<T>().eq(field1, value1).eq(field2, value2));
|
||||||
}
|
}
|
||||||
|
@ -151,7 +145,8 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
|
||||||
*/
|
*/
|
||||||
default Boolean insertBatch(Collection<T> entities) {
|
default Boolean insertBatch(Collection<T> entities) {
|
||||||
// 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
|
// 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
|
||||||
if (Objects.equals(SqlConstants.DB_TYPE, DbType.SQL_SERVER)) {
|
DbType dbType = JdbcUtils.getDbType();
|
||||||
|
if (JdbcUtils.isSQLServer(dbType)) {
|
||||||
entities.forEach(this::insert);
|
entities.forEach(this::insert);
|
||||||
return CollUtil.isNotEmpty(entities);
|
return CollUtil.isNotEmpty(entities);
|
||||||
}
|
}
|
||||||
|
@ -166,7 +161,8 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
|
||||||
*/
|
*/
|
||||||
default Boolean insertBatch(Collection<T> entities, int size) {
|
default Boolean insertBatch(Collection<T> entities, int size) {
|
||||||
// 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
|
// 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
|
||||||
if (Objects.equals(SqlConstants.DB_TYPE, DbType.SQL_SERVER)) {
|
DbType dbType = JdbcUtils.getDbType();
|
||||||
|
if (JdbcUtils.isSQLServer(dbType)) {
|
||||||
entities.forEach(this::insert);
|
entities.forEach(this::insert);
|
||||||
return CollUtil.isNotEmpty(entities);
|
return CollUtil.isNotEmpty(entities);
|
||||||
}
|
}
|
||||||
|
@ -185,10 +181,6 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
|
||||||
return Db.updateBatchById(entities, size);
|
return Db.updateBatchById(entities, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
default Boolean insertOrUpdateBatch(Collection<T> collection) {
|
|
||||||
return Db.saveOrUpdateBatch(collection);
|
|
||||||
}
|
|
||||||
|
|
||||||
default int delete(String field, String value) {
|
default int delete(String field, String value) {
|
||||||
return delete(new QueryWrapper<T>().eq(field, value));
|
return delete(new QueryWrapper<T>().eq(field, value));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.yudao.framework.mybatis.core.query;
|
package cn.iocoder.yudao.framework.mybatis.core.query;
|
||||||
|
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
|
import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||||
|
@ -147,8 +147,8 @@ public class QueryWrapperX<T> extends QueryWrapper<T> {
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
public QueryWrapperX<T> limitN(int n) {
|
public QueryWrapperX<T> limitN(int n) {
|
||||||
Assert.notNull(SqlConstants.DB_TYPE, "获取不到数据库的类型");
|
DbType dbType = JdbcUtils.getDbType();
|
||||||
switch (SqlConstants.DB_TYPE) {
|
switch (dbType) {
|
||||||
case ORACLE:
|
case ORACLE:
|
||||||
case ORACLE_12C:
|
case ORACLE_12C:
|
||||||
super.le("ROWNUM", n);
|
super.le("ROWNUM", n);
|
||||||
|
@ -157,7 +157,7 @@ public class QueryWrapperX<T> extends QueryWrapper<T> {
|
||||||
case SQL_SERVER2005:
|
case SQL_SERVER2005:
|
||||||
super.select("TOP " + n + " *"); // 由于 SQL Server 是通过 SELECT TOP 1 实现限制一条,所以只好使用 * 查询剩余字段
|
super.select("TOP " + n + " *"); // 由于 SQL Server 是通过 SELECT TOP 1 实现限制一条,所以只好使用 * 查询剩余字段
|
||||||
break;
|
break;
|
||||||
default:
|
default: // MySQL、PostgreSQL、DM 达梦、KingbaseES 大金都是采用 LIMIT 实现
|
||||||
super.last("LIMIT " + n);
|
super.last("LIMIT " + n);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
package cn.iocoder.yudao.framework.mybatis.core.util;
|
package cn.iocoder.yudao.framework.mybatis.core.util;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
|
import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum;
|
import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum;
|
||||||
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
|
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
|
||||||
import com.baomidou.mybatisplus.annotation.DbType;
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
|
@ -49,8 +51,13 @@ public class JdbcUtils {
|
||||||
* @return DB 类型
|
* @return DB 类型
|
||||||
*/
|
*/
|
||||||
public static DbType getDbType() {
|
public static DbType getDbType() {
|
||||||
DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class);
|
DataSource dataSource;
|
||||||
DataSource dataSource = dynamicRoutingDataSource.determineDataSource();
|
try {
|
||||||
|
DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class);
|
||||||
|
dataSource = dynamicRoutingDataSource.determineDataSource();
|
||||||
|
} catch (NoSuchBeanDefinitionException e) {
|
||||||
|
dataSource = SpringUtils.getBean(DataSource.class);
|
||||||
|
}
|
||||||
try (Connection conn = dataSource.getConnection()) {
|
try (Connection conn = dataSource.getConnection()) {
|
||||||
return DbTypeEnum.find(conn.getMetaData().getDatabaseProductName());
|
return DbTypeEnum.find(conn.getMetaData().getDatabaseProductName());
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
@ -58,4 +65,25 @@ public class JdbcUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断 JDBC 连接是否为 SQLServer 数据库
|
||||||
|
*
|
||||||
|
* @param url JDBC 连接
|
||||||
|
* @return 是否为 SQLServer 数据库
|
||||||
|
*/
|
||||||
|
public static boolean isSQLServer(String url) {
|
||||||
|
DbType dbType = getDbType(url);
|
||||||
|
return isSQLServer(dbType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断 JDBC 连接是否为 SQLServer 数据库
|
||||||
|
*
|
||||||
|
* @param url JDBC 连接
|
||||||
|
* @return 是否为 SQLServer 数据库
|
||||||
|
*/
|
||||||
|
public static boolean isSQLServer(DbType dbType) {
|
||||||
|
return ObjectUtils.equalsAny(dbType, DbType.SQL_SERVER, DbType.SQL_SERVER2005);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,7 +96,6 @@ public class MyBatisUtils {
|
||||||
* @return sql
|
* @return sql
|
||||||
*/
|
*/
|
||||||
public static String findInSet(String column, Object value) {
|
public static String findInSet(String column, Object value) {
|
||||||
// 这里不用SqlConstants.DB_TYPE,因为它是使用 primary 数据源的 url 推断出来的类型
|
|
||||||
DbType dbType = JdbcUtils.getDbType();
|
DbType dbType = JdbcUtils.getDbType();
|
||||||
return DbTypeEnum.getFindInSetTemplate(dbType)
|
return DbTypeEnum.getFindInSetTemplate(dbType)
|
||||||
.replace("#{column}", column)
|
.replace("#{column}", column)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package cn.iocoder.yudao.framework.test.core.ut;
|
package cn.iocoder.yudao.framework.test.core.ut;
|
||||||
|
|
||||||
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
|
import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
|
||||||
import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
|
import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
|
||||||
import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
|
import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
|
||||||
|
@ -44,6 +45,9 @@ public class BaseDbAndRedisUnitTest {
|
||||||
YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
|
YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
|
||||||
RedisAutoConfiguration.class, // Spring Redis 自动配置类
|
RedisAutoConfiguration.class, // Spring Redis 自动配置类
|
||||||
RedissonAutoConfiguration.class, // Redisson 自动配置类
|
RedissonAutoConfiguration.class, // Redisson 自动配置类
|
||||||
|
|
||||||
|
// 其它配置类
|
||||||
|
SpringUtil.class
|
||||||
})
|
})
|
||||||
public static class Application {
|
public static class Application {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package cn.iocoder.yudao.framework.test.core.ut;
|
package cn.iocoder.yudao.framework.test.core.ut;
|
||||||
|
|
||||||
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
|
import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
|
||||||
import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
|
import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
|
||||||
import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
|
import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
|
||||||
|
@ -36,6 +37,9 @@ public class BaseDbUnitTest {
|
||||||
YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
|
YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
|
||||||
MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
|
MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
|
||||||
MybatisPlusJoinAutoConfiguration.class, // MyBatis 的Join配置类
|
MybatisPlusJoinAutoConfiguration.class, // MyBatis 的Join配置类
|
||||||
|
|
||||||
|
// 其它配置类
|
||||||
|
SpringUtil.class
|
||||||
})
|
})
|
||||||
public static class Application {
|
public static class Application {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package cn.iocoder.yudao.framework.test.core.ut;
|
package cn.iocoder.yudao.framework.test.core.ut;
|
||||||
|
|
||||||
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
|
import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
|
||||||
import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration;
|
import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration;
|
||||||
import org.redisson.spring.starter.RedissonAutoConfiguration;
|
import org.redisson.spring.starter.RedissonAutoConfiguration;
|
||||||
|
@ -25,6 +26,9 @@ public class BaseRedisUnitTest {
|
||||||
RedisAutoConfiguration.class, // Spring Redis 自动配置类
|
RedisAutoConfiguration.class, // Spring Redis 自动配置类
|
||||||
YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
|
YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
|
||||||
RedissonAutoConfiguration.class, // Redisson 自动配置类
|
RedissonAutoConfiguration.class, // Redisson 自动配置类
|
||||||
|
|
||||||
|
// 其它配置类
|
||||||
|
SpringUtil.class
|
||||||
})
|
})
|
||||||
public static class Application {
|
public static class Application {
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,6 +137,11 @@ public class RandomUtils {
|
||||||
@SafeVarargs
|
@SafeVarargs
|
||||||
public static <T> List<T> randomPojoList(Class<T> clazz, Consumer<T>... consumers) {
|
public static <T> List<T> randomPojoList(Class<T> clazz, Consumer<T>... consumers) {
|
||||||
int size = RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH);
|
int size = RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH);
|
||||||
|
return randomPojoList(clazz, size, consumers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public static <T> List<T> randomPojoList(Class<T> clazz, int size, Consumer<T>... consumers) {
|
||||||
return Stream.iterate(0, i -> i).limit(size).map(o -> randomPojo(clazz, consumers))
|
return Stream.iterate(0, i -> i).limit(size).map(o -> randomPojo(clazz, consumers))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,19 +2,19 @@ package cn.iocoder.yudao.module.infra.controller.app.file;
|
||||||
|
|
||||||
import cn.hutool.core.io.IoUtil;
|
import cn.hutool.core.io.IoUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FileCreateReqVO;
|
||||||
|
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO;
|
||||||
import cn.iocoder.yudao.module.infra.controller.app.file.vo.AppFileUploadReqVO;
|
import cn.iocoder.yudao.module.infra.controller.app.file.vo.AppFileUploadReqVO;
|
||||||
import cn.iocoder.yudao.module.infra.service.file.FileService;
|
import cn.iocoder.yudao.module.infra.service.file.FileService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
@Tag(name = "用户 App - 文件存储")
|
@Tag(name = "用户 App - 文件存储")
|
||||||
|
@ -35,4 +35,16 @@ public class AppFileController {
|
||||||
return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream())));
|
return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/presigned-url")
|
||||||
|
@Operation(summary = "获取文件预签名地址", description = "模式二:前端上传文件:用于前端直接上传七牛、阿里云 OSS 等文件存储器")
|
||||||
|
public CommonResult<FilePresignedUrlRespVO> getFilePresignedUrl(@RequestParam("path") String path) throws Exception {
|
||||||
|
return success(fileService.getFilePresignedUrl(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/create")
|
||||||
|
@Operation(summary = "创建文件", description = "模式二:前端上传文件:配合 presigned-url 接口,记录上传了上传的文件")
|
||||||
|
public CommonResult<Long> createFile(@Valid @RequestBody FileCreateReqVO createReqVO) {
|
||||||
|
return success(fileService.createFile(createReqVO));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ public interface CodegenColumnMapper extends BaseMapperX<CodegenColumnDO> {
|
||||||
default List<CodegenColumnDO> selectListByTableId(Long tableId) {
|
default List<CodegenColumnDO> selectListByTableId(Long tableId) {
|
||||||
return selectList(new LambdaQueryWrapperX<CodegenColumnDO>()
|
return selectList(new LambdaQueryWrapperX<CodegenColumnDO>()
|
||||||
.eq(CodegenColumnDO::getTableId, tableId)
|
.eq(CodegenColumnDO::getTableId, tableId)
|
||||||
.orderByAsc(CodegenColumnDO::getId));
|
.orderByAsc(CodegenColumnDO::getOrdinalPosition));
|
||||||
}
|
}
|
||||||
|
|
||||||
default void deleteListByTableId(Long tableId) {
|
default void deleteListByTableId(Long tableId) {
|
||||||
|
|
|
@ -34,4 +34,10 @@ public class CodegenProperties {
|
||||||
@NotNull(message = "代码生成的前端类型不能为空")
|
@NotNull(message = "代码生成的前端类型不能为空")
|
||||||
private Integer frontType;
|
private Integer frontType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否生成单元测试
|
||||||
|
*/
|
||||||
|
@NotNull(message = "是否生成单元测试不能为空")
|
||||||
|
private Boolean unitTestEnable;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,13 +22,14 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
import com.baomidou.mybatisplus.generator.config.po.TableField;
|
import com.baomidou.mybatisplus.generator.config.po.TableField;
|
||||||
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
|
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.BiPredicate;
|
import java.util.function.BiPredicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||||
|
@ -179,11 +180,18 @@ public class CodegenServiceImpl implements CodegenService {
|
||||||
&& tableField.getMetaInfo().isNullable() == codegenColumn.getNullable()
|
&& tableField.getMetaInfo().isNullable() == codegenColumn.getNullable()
|
||||||
&& tableField.isKeyFlag() == codegenColumn.getPrimaryKey()
|
&& tableField.isKeyFlag() == codegenColumn.getPrimaryKey()
|
||||||
&& tableField.getComment().equals(codegenColumn.getColumnComment());
|
&& tableField.getComment().equals(codegenColumn.getColumnComment());
|
||||||
Set<String> modifyFieldNames = tableFields.stream()
|
Set<String> modifyFieldNames = IntStream.range(0, tableFields.size()).mapToObj(index -> {
|
||||||
.filter(tableField -> codegenColumnDOMap.get(tableField.getColumnName()) != null
|
TableField tableField = tableFields.get(index);
|
||||||
&& !primaryKeyPredicate.test(tableField, codegenColumnDOMap.get(tableField.getColumnName())))
|
String columnName = tableField.getColumnName();
|
||||||
.map(TableField::getColumnName)
|
CodegenColumnDO codegenColumn = codegenColumnDOMap.get(columnName);
|
||||||
.collect(Collectors.toSet());
|
if (codegenColumn == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (!primaryKeyPredicate.test(tableField, codegenColumn) || codegenColumn.getOrdinalPosition() != index) {
|
||||||
|
return columnName;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}).filter(Objects::nonNull).collect(Collectors.toSet());
|
||||||
// 3.2 计算需要【删除】的字段
|
// 3.2 计算需要【删除】的字段
|
||||||
Set<String> tableFieldNames = convertSet(tableFields, TableField::getName);
|
Set<String> tableFieldNames = convertSet(tableFields, TableField::getName);
|
||||||
Set<Long> deleteColumnIds = codegenColumns.stream()
|
Set<Long> deleteColumnIds = codegenColumns.stream()
|
||||||
|
|
|
@ -398,6 +398,11 @@ public class CodegenEngine {
|
||||||
Map<String, String> templates = new LinkedHashMap<>();
|
Map<String, String> templates = new LinkedHashMap<>();
|
||||||
templates.putAll(SERVER_TEMPLATES);
|
templates.putAll(SERVER_TEMPLATES);
|
||||||
templates.putAll(FRONT_TEMPLATES.row(frontType));
|
templates.putAll(FRONT_TEMPLATES.row(frontType));
|
||||||
|
// 如果禁用单元测试,则移除对应的模版
|
||||||
|
if (Boolean.FALSE.equals(codegenProperties.getUnitTestEnable())) {
|
||||||
|
templates.remove(javaTemplatePath("test/serviceTest"));
|
||||||
|
templates.remove("codegen/sql/h2.vm");
|
||||||
|
}
|
||||||
return templates;
|
return templates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
|
import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
|
||||||
import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
|
import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
|
||||||
import com.baomidou.mybatisplus.annotation.DbType;
|
|
||||||
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
|
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
|
||||||
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
|
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
|
||||||
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
|
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
|
||||||
|
@ -18,7 +17,6 @@ import org.springframework.stereotype.Service;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -49,12 +47,11 @@ public class DatabaseTableServiceImpl implements DatabaseTableService {
|
||||||
// 获得数据源配置
|
// 获得数据源配置
|
||||||
DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
|
DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
|
||||||
Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId);
|
Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId);
|
||||||
DbType dbType = JdbcUtils.getDbType(config.getUrl());
|
|
||||||
|
|
||||||
// 使用 MyBatis Plus Generator 解析表结构
|
// 使用 MyBatis Plus Generator 解析表结构
|
||||||
DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(),
|
DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(),
|
||||||
config.getPassword());
|
config.getPassword());
|
||||||
if (Objects.equals(dbType, DbType.SQL_SERVER)) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419
|
if (JdbcUtils.isSQLServer(config.getUrl())) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419
|
||||||
dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class);
|
dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class);
|
||||||
}
|
}
|
||||||
StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到
|
StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到
|
||||||
|
|
|
@ -24,12 +24,11 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||||
import com.baomidou.mybatisplus.generator.config.po.TableField;
|
import com.baomidou.mybatisplus.generator.config.po.TableField;
|
||||||
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
|
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
|
||||||
import org.junit.jupiter.api.Disabled;
|
import jakarta.annotation.Resource;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -234,17 +233,16 @@ public class CodegenServiceImplTest extends BaseDbUnitTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Disabled // TODO @芋艿:这个单测会随机性失败,需要定位下;
|
|
||||||
public void testSyncCodegenFromDB() {
|
public void testSyncCodegenFromDB() {
|
||||||
// mock 数据(CodegenTableDO)
|
// mock 数据(CodegenTableDO)
|
||||||
CodegenTableDO table = randomPojo(CodegenTableDO.class, o -> o.setTableName("t_yunai")
|
CodegenTableDO table = randomPojo(CodegenTableDO.class, o -> o.setTableName("t_yunai")
|
||||||
.setDataSourceConfigId(1L).setScene(CodegenSceneEnum.ADMIN.getScene()));
|
.setDataSourceConfigId(1L).setScene(CodegenSceneEnum.ADMIN.getScene()));
|
||||||
codegenTableMapper.insert(table);
|
codegenTableMapper.insert(table);
|
||||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
||||||
.setColumnName("id"));
|
.setColumnName("id").setPrimaryKey(true).setOrdinalPosition(0));
|
||||||
codegenColumnMapper.insert(column01);
|
codegenColumnMapper.insert(column01);
|
||||||
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
||||||
.setColumnName("name"));
|
.setColumnName("name").setOrdinalPosition(1));
|
||||||
codegenColumnMapper.insert(column02);
|
codegenColumnMapper.insert(column02);
|
||||||
// 准备参数
|
// 准备参数
|
||||||
Long tableId = table.getId();
|
Long tableId = table.getId();
|
||||||
|
@ -263,7 +261,7 @@ public class CodegenServiceImplTest extends BaseDbUnitTest {
|
||||||
when(databaseTableService.getTable(eq(1L), eq("t_yunai")))
|
when(databaseTableService.getTable(eq(1L), eq("t_yunai")))
|
||||||
.thenReturn(tableInfo);
|
.thenReturn(tableInfo);
|
||||||
// mock 方法(CodegenTableDO)
|
// mock 方法(CodegenTableDO)
|
||||||
List<CodegenColumnDO> newColumns = randomPojoList(CodegenColumnDO.class);
|
List<CodegenColumnDO> newColumns = randomPojoList(CodegenColumnDO.class, 2);
|
||||||
when(codegenBuilder.buildColumns(eq(table.getId()), argThat(tableFields -> {
|
when(codegenBuilder.buildColumns(eq(table.getId()), argThat(tableFields -> {
|
||||||
assertEquals(2, tableFields.size());
|
assertEquals(2, tableFields.size());
|
||||||
assertSame(tableInfo.getFields(), tableFields);
|
assertSame(tableInfo.getFields(), tableFields);
|
||||||
|
@ -457,9 +455,11 @@ public class CodegenServiceImplTest extends BaseDbUnitTest {
|
||||||
.setTemplateType(CodegenTemplateTypeEnum.ONE.getType()));
|
.setTemplateType(CodegenTemplateTypeEnum.ONE.getType()));
|
||||||
codegenTableMapper.insert(table);
|
codegenTableMapper.insert(table);
|
||||||
// mock 数据(CodegenColumnDO)
|
// mock 数据(CodegenColumnDO)
|
||||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
||||||
|
.setOrdinalPosition(1));
|
||||||
codegenColumnMapper.insert(column01);
|
codegenColumnMapper.insert(column01);
|
||||||
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
||||||
|
.setOrdinalPosition(2));
|
||||||
codegenColumnMapper.insert(column02);
|
codegenColumnMapper.insert(column02);
|
||||||
// mock 执行生成
|
// mock 执行生成
|
||||||
Map<String, String> codes = MapUtil.of(randomString(), randomString());
|
Map<String, String> codes = MapUtil.of(randomString(), randomString());
|
||||||
|
@ -486,9 +486,11 @@ public class CodegenServiceImplTest extends BaseDbUnitTest {
|
||||||
.setTemplateType(CodegenTemplateTypeEnum.MASTER_NORMAL.getType()));
|
.setTemplateType(CodegenTemplateTypeEnum.MASTER_NORMAL.getType()));
|
||||||
codegenTableMapper.insert(table);
|
codegenTableMapper.insert(table);
|
||||||
// mock 数据(CodegenColumnDO)
|
// mock 数据(CodegenColumnDO)
|
||||||
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
||||||
|
.setOrdinalPosition(1));
|
||||||
codegenColumnMapper.insert(column01);
|
codegenColumnMapper.insert(column01);
|
||||||
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
|
CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
|
||||||
|
.setOrdinalPosition(2));
|
||||||
codegenColumnMapper.insert(column02);
|
codegenColumnMapper.insert(column02);
|
||||||
// mock 数据(sub CodegenTableDO)
|
// mock 数据(sub CodegenTableDO)
|
||||||
CodegenTableDO subTable = randomPojo(CodegenTableDO.class,
|
CodegenTableDO subTable = randomPojo(CodegenTableDO.class,
|
||||||
|
|
|
@ -3,18 +3,16 @@ package cn.iocoder.yudao.module.system.service.notify;
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
|
|
||||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyMessageDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyMessageDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyTemplateDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyTemplateDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.mysql.notify.NotifyMessageMapper;
|
import cn.iocoder.yudao.module.system.dal.mysql.notify.NotifyMessageMapper;
|
||||||
import com.baomidou.mybatisplus.annotation.DbType;
|
import jakarta.annotation.Resource;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -158,7 +156,6 @@ public class NotifyMessageServiceImplTest extends BaseDbUnitTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetUnreadNotifyMessageList() {
|
public void testGetUnreadNotifyMessageList() {
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
// mock 数据
|
// mock 数据
|
||||||
NotifyMessageDO dbNotifyMessage = randomPojo(NotifyMessageDO.class, o -> { // 等会查询到
|
NotifyMessageDO dbNotifyMessage = randomPojo(NotifyMessageDO.class, o -> { // 等会查询到
|
||||||
o.setUserId(1L);
|
o.setUserId(1L);
|
||||||
|
@ -187,7 +184,6 @@ public class NotifyMessageServiceImplTest extends BaseDbUnitTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetUnreadNotifyMessageCount() {
|
public void testGetUnreadNotifyMessageCount() {
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
// mock 数据
|
// mock 数据
|
||||||
NotifyMessageDO dbNotifyMessage = randomPojo(NotifyMessageDO.class, o -> { // 等会查询到
|
NotifyMessageDO dbNotifyMessage = randomPojo(NotifyMessageDO.class, o -> { // 等会查询到
|
||||||
o.setUserId(1L);
|
o.setUserId(1L);
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package cn.iocoder.yudao.module.system.service.sms;
|
package cn.iocoder.yudao.module.system.service.sms;
|
||||||
|
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
|
|
||||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
||||||
|
@ -10,13 +9,12 @@ import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
|
import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
|
||||||
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
|
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
|
||||||
import cn.iocoder.yudao.module.system.framework.sms.config.SmsCodeProperties;
|
import cn.iocoder.yudao.module.system.framework.sms.config.SmsCodeProperties;
|
||||||
import com.baomidou.mybatisplus.annotation.DbType;
|
import jakarta.annotation.Resource;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@ -61,8 +59,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
|
||||||
o.setMobile("15601691300");
|
o.setMobile("15601691300");
|
||||||
o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
|
o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
|
||||||
});
|
});
|
||||||
// mock 方法
|
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
smsCodeService.sendSmsCode(reqDTO);
|
smsCodeService.sendSmsCode(reqDTO);
|
||||||
|
@ -88,8 +84,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
|
||||||
o.setMobile("15601691300");
|
o.setMobile("15601691300");
|
||||||
o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
|
o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
|
||||||
});
|
});
|
||||||
// mock 方法
|
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
|
|
||||||
// 调用,并断言异常
|
// 调用,并断言异常
|
||||||
assertServiceException(() -> smsCodeService.sendSmsCode(reqDTO),
|
assertServiceException(() -> smsCodeService.sendSmsCode(reqDTO),
|
||||||
|
@ -107,8 +101,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
|
||||||
o.setMobile("15601691300");
|
o.setMobile("15601691300");
|
||||||
o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
|
o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
|
||||||
});
|
});
|
||||||
// mock 方法
|
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
when(smsCodeProperties.getSendFrequency()).thenReturn(Duration.ofMillis(0));
|
when(smsCodeProperties.getSendFrequency()).thenReturn(Duration.ofMillis(0));
|
||||||
|
|
||||||
// 调用,并断言异常
|
// 调用,并断言异常
|
||||||
|
@ -123,8 +115,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
|
||||||
o.setMobile("15601691300");
|
o.setMobile("15601691300");
|
||||||
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
});
|
});
|
||||||
// mock 数据
|
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> {
|
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> {
|
||||||
o.setMobile(reqDTO.getMobile()).setScene(reqDTO.getScene())
|
o.setMobile(reqDTO.getMobile()).setScene(reqDTO.getScene())
|
||||||
.setCode(reqDTO.getCode()).setUsed(false);
|
.setCode(reqDTO.getCode()).setUsed(false);
|
||||||
|
@ -146,8 +136,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
|
||||||
o.setMobile("15601691300");
|
o.setMobile("15601691300");
|
||||||
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
});
|
});
|
||||||
// mock 数据
|
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
|
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
|
||||||
.setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)));
|
.setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)));
|
||||||
|
|
||||||
|
@ -162,8 +150,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
|
||||||
o.setMobile("15601691300");
|
o.setMobile("15601691300");
|
||||||
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
});
|
});
|
||||||
// mock 数据
|
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
|
|
||||||
// 调用,并断言异常
|
// 调用,并断言异常
|
||||||
assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
|
assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
|
||||||
|
@ -177,8 +163,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
|
||||||
o.setMobile("15601691300");
|
o.setMobile("15601691300");
|
||||||
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
});
|
});
|
||||||
// mock 数据
|
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
|
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
|
||||||
.setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)
|
.setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)
|
||||||
.setCreateTime(LocalDateTime.now().minusMinutes(6))));
|
.setCreateTime(LocalDateTime.now().minusMinutes(6))));
|
||||||
|
@ -195,8 +179,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
|
||||||
o.setMobile("15601691300");
|
o.setMobile("15601691300");
|
||||||
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
});
|
});
|
||||||
// mock 数据
|
|
||||||
SqlConstants.init(DbType.MYSQL);
|
|
||||||
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
|
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
|
||||||
.setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(true)
|
.setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(true)
|
||||||
.setCreateTime(LocalDateTime.now())));
|
.setCreateTime(LocalDateTime.now())));
|
||||||
|
|
|
@ -246,6 +246,7 @@ yudao:
|
||||||
base-package: ${yudao.info.base-package}
|
base-package: ${yudao.info.base-package}
|
||||||
db-schemas: ${spring.datasource.dynamic.datasource.master.name}
|
db-schemas: ${spring.datasource.dynamic.datasource.master.name}
|
||||||
front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类
|
front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类
|
||||||
|
unit-test-enable: false # 是否生成单元测试
|
||||||
tenant: # 多租户相关配置项
|
tenant: # 多租户相关配置项
|
||||||
enable: true
|
enable: true
|
||||||
ignore-urls:
|
ignore-urls:
|
||||||
|
|
Loading…
Reference in New Issue