=UTF-8
diff --git a/bdty-admin/.settings/org.eclipse.jdt.core.prefs b/bdty-admin/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..6e80039
--- /dev/null
+++ b/bdty-admin/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/bdty-admin/.settings/org.eclipse.m2e.core.prefs b/bdty-admin/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/bdty-admin/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/bdty-admin/.settings/org.eclipse.wst.common.project.facet.core.xml b/bdty-admin/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/bdty-admin/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/bdty-admin/Dockerfile b/bdty-admin/Dockerfile
new file mode 100644
index 0000000..9db81f6
--- /dev/null
+++ b/bdty-admin/Dockerfile
@@ -0,0 +1,7 @@
+FROM java:8
+EXPOSE 8080
+
+VOLUME /tmp
+ADD renren-admin.jar /app.jar
+RUN bash -c 'touch /app.jar'
+ENTRYPOINT ["java","-jar","/app.jar"]
diff --git a/bdty-admin/db/dm8.sql b/bdty-admin/db/dm8.sql
new file mode 100644
index 0000000..c8ba6a7
--- /dev/null
+++ b/bdty-admin/db/dm8.sql
@@ -0,0 +1,674 @@
+CREATE TABLE sys_user (
+ id bigint NOT NULL,
+ username varchar(50) NOT NULL,
+ password varchar(100),
+ real_name varchar(50),
+ head_url varchar(200),
+ gender int,
+ email varchar(100),
+ mobile varchar(100),
+ dept_id bigint,
+ super_admin int,
+ status int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+
+CREATE UNIQUE INDEX uk_sys_user_username on sys_user(username);
+CREATE INDEX idx_sys_user_create_date on sys_user(create_date);
+
+COMMENT ON TABLE sys_user IS '用户管理';
+COMMENT ON COLUMN sys_user.id IS 'id';
+COMMENT ON COLUMN sys_user.username IS '用户名';
+COMMENT ON COLUMN sys_user.password IS '密码';
+COMMENT ON COLUMN sys_user.real_name IS '姓名';
+COMMENT ON COLUMN sys_user.head_url IS '头像';
+COMMENT ON COLUMN sys_user.gender IS '性别 0:男 1:女 2:保密';
+COMMENT ON COLUMN sys_user.email IS '邮箱';
+COMMENT ON COLUMN sys_user.mobile IS '手机号';
+COMMENT ON COLUMN sys_user.dept_id IS '部门ID';
+COMMENT ON COLUMN sys_user.super_admin IS '超级管理员 0:否 1:是';
+COMMENT ON COLUMN sys_user.status IS '状态 0:停用 1:正常';
+COMMENT ON COLUMN sys_user.creator IS '创建者';
+COMMENT ON COLUMN sys_user.create_date IS '创建时间';
+COMMENT ON COLUMN sys_user.updater IS '更新者';
+COMMENT ON COLUMN sys_user.update_date IS '更新时间';
+
+
+CREATE TABLE sys_dept (
+ id bigint NOT NULL,
+ pid bigint,
+ pids varchar(500),
+ name varchar(50),
+ sort int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_sys_dept_pid on sys_dept(pid);
+CREATE INDEX idx_sys_dept_idx_sort on sys_dept(sort);
+
+COMMENT ON TABLE sys_dept IS '部门管理';
+COMMENT ON COLUMN sys_dept.id IS 'id';
+COMMENT ON COLUMN sys_dept.pid IS '上级ID';
+COMMENT ON COLUMN sys_dept.pids IS '所有上级ID,用逗号分开';
+COMMENT ON COLUMN sys_dept.name IS '部门名称';
+COMMENT ON COLUMN sys_dept.sort IS '排序';
+COMMENT ON COLUMN sys_dept.creator IS '创建者';
+COMMENT ON COLUMN sys_dept.create_date IS '创建时间';
+COMMENT ON COLUMN sys_dept.updater IS '更新者';
+COMMENT ON COLUMN sys_dept.update_date IS '更新时间';
+
+
+create table sys_role
+(
+ id bigint NOT NULL,
+ name varchar(50),
+ remark varchar(100),
+ dept_id bigint,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_dept_id on sys_role(dept_id);
+
+COMMENT ON TABLE sys_role IS '角色管理';
+COMMENT ON COLUMN sys_role.id IS 'id';
+COMMENT ON COLUMN sys_role.name IS '角色名称';
+COMMENT ON COLUMN sys_role.remark IS '备注';
+COMMENT ON COLUMN sys_role.dept_id IS '部门ID';
+COMMENT ON COLUMN sys_role.creator IS '创建者';
+COMMENT ON COLUMN sys_role.create_date IS '创建时间';
+COMMENT ON COLUMN sys_role.updater IS '更新者';
+COMMENT ON COLUMN sys_role.update_date IS '更新时间';
+
+
+create table sys_menu
+(
+ id bigint NOT NULL,
+ pid bigint,
+ name varchar(200),
+ url varchar(200),
+ permissions varchar(500),
+ menu_type int,
+ icon varchar(50),
+ sort int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_menu_pid on sys_menu(pid);
+CREATE INDEX idx_sys_menu_sort on sys_menu(sort);
+
+COMMENT ON TABLE sys_menu IS '菜单管理';
+COMMENT ON COLUMN sys_menu.id IS 'id';
+COMMENT ON COLUMN sys_menu.pid IS '上级ID,一级菜单为0';
+COMMENT ON COLUMN sys_menu.name IS '名称';
+COMMENT ON COLUMN sys_menu.url IS '菜单URL';
+COMMENT ON COLUMN sys_menu.permissions IS '授权(多个用逗号分隔,如:sys:user:list,sys:user:save)';
+COMMENT ON COLUMN sys_menu.menu_type IS '类型 0:菜单 1:按钮';
+COMMENT ON COLUMN sys_menu.icon IS '菜单图标';
+COMMENT ON COLUMN sys_menu.sort IS '排序';
+COMMENT ON COLUMN sys_menu.creator IS '创建者';
+COMMENT ON COLUMN sys_menu.create_date IS '创建时间';
+COMMENT ON COLUMN sys_menu.updater IS '更新者';
+COMMENT ON COLUMN sys_menu.update_date IS '更新时间';
+
+
+create table sys_role_user
+(
+ id bigint NOT NULL,
+ role_id bigint,
+ user_id bigint,
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_user_role_id on sys_role_user(role_id);
+CREATE INDEX idx_sys_role_user_user_id on sys_role_user(user_id);
+
+COMMENT ON TABLE sys_role_user IS '角色用户关系';
+COMMENT ON COLUMN sys_role_user.role_id IS '角色ID';
+COMMENT ON COLUMN sys_role_user.user_id IS '用户ID';
+COMMENT ON COLUMN sys_role_user.creator IS '创建者';
+COMMENT ON COLUMN sys_role_user.create_date IS '创建时间';
+
+
+create table sys_role_menu
+(
+ id bigint NOT NULL,
+ role_id bigint,
+ menu_id bigint,
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_menu_role_id on sys_role_menu(role_id);
+CREATE INDEX idx_sys_role_menu_menu_id on sys_role_menu(menu_id);
+
+COMMENT ON TABLE sys_role_menu IS '角色菜单关系';
+COMMENT ON COLUMN sys_role_menu.role_id IS '角色ID';
+COMMENT ON COLUMN sys_role_menu.menu_id IS '菜单ID';
+COMMENT ON COLUMN sys_role_menu.creator IS '创建者';
+COMMENT ON COLUMN sys_role_menu.create_date IS '创建时间';
+
+
+create table sys_role_data_scope
+(
+ id bigint NOT NULL,
+ role_id bigint,
+ dept_id bigint,
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_data_scope_role_id on sys_role_data_scope(role_id);
+
+COMMENT ON TABLE sys_role_data_scope IS '角色数据权限';
+COMMENT ON COLUMN sys_role_data_scope.role_id IS '角色ID';
+COMMENT ON COLUMN sys_role_data_scope.dept_id IS '部门ID';
+COMMENT ON COLUMN sys_role_data_scope.creator IS '创建者';
+COMMENT ON COLUMN sys_role_data_scope.create_date IS '创建时间';
+
+
+create table sys_params
+(
+ id bigint NOT NULL,
+ param_code varchar(32),
+ param_value varchar(2000),
+ param_type int DEFAULT 1 NOT NULL,
+ remark varchar(200),
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+CREATE UNIQUE INDEX uk_sys_params_param_code on sys_params(param_code);
+CREATE INDEX idx_sys_params_create_date on sys_params(create_date);
+
+COMMENT ON TABLE sys_params IS '参数管理';
+COMMENT ON COLUMN sys_params.param_code IS '参数编码';
+COMMENT ON COLUMN sys_params.param_value IS '参数值';
+COMMENT ON COLUMN sys_params.param_type IS '类型 0:系统参数 1:非系统参数';
+COMMENT ON COLUMN sys_params.remark IS '备注';
+COMMENT ON COLUMN sys_params.creator IS '创建者';
+COMMENT ON COLUMN sys_params.create_date IS '创建时间';
+COMMENT ON COLUMN sys_params.updater IS '更新者';
+COMMENT ON COLUMN sys_params.update_date IS '更新时间';
+
+
+create table sys_dict_type
+(
+ id bigint NOT NULL,
+ dict_type varchar(100),
+ dict_name varchar(255),
+ remark varchar(255),
+ sort int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+CREATE UNIQUE INDEX uk_sys_dict_type_dict_type on sys_dict_type(dict_type);
+
+COMMENT ON TABLE sys_dict_type IS '字典类型';
+COMMENT ON COLUMN sys_dict_type.id IS 'id';
+COMMENT ON COLUMN sys_dict_type.dict_type IS '字典类型';
+COMMENT ON COLUMN sys_dict_type.dict_name IS '字典名称';
+COMMENT ON COLUMN sys_dict_type.remark IS '备注';
+COMMENT ON COLUMN sys_dict_type.sort IS '排序';
+COMMENT ON COLUMN sys_dict_type.creator IS '创建者';
+COMMENT ON COLUMN sys_dict_type.create_date IS '创建时间';
+COMMENT ON COLUMN sys_dict_type.updater IS '更新者';
+COMMENT ON COLUMN sys_dict_type.update_date IS '更新时间';
+
+create table sys_dict_data
+(
+ id bigint NOT NULL,
+ dict_type_id bigint NOT NULL,
+ dict_label varchar(255),
+ dict_value varchar(255),
+ remark varchar(255),
+ sort int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_sys_dict_data_sort on sys_dict_data(sort);
+CREATE UNIQUE INDEX uk_dict_type_value on sys_dict_data(dict_type_id, dict_value);
+
+COMMENT ON TABLE sys_dict_data IS '字典数据';
+COMMENT ON COLUMN sys_dict_data.id IS 'id';
+COMMENT ON COLUMN sys_dict_data.dict_type_id IS '字典类型ID';
+COMMENT ON COLUMN sys_dict_data.dict_label IS '字典标签';
+COMMENT ON COLUMN sys_dict_data.dict_value IS '字典值';
+COMMENT ON COLUMN sys_dict_data.remark IS '备注';
+COMMENT ON COLUMN sys_dict_data.sort IS '排序';
+COMMENT ON COLUMN sys_dict_data.creator IS '创建者';
+COMMENT ON COLUMN sys_dict_data.create_date IS '创建时间';
+COMMENT ON COLUMN sys_dict_data.updater IS '更新者';
+COMMENT ON COLUMN sys_dict_data.update_date IS '更新时间';
+
+
+create table sys_log_login
+(
+ id bigint NOT NULL,
+ operation int,
+ status int,
+ user_agent varchar(500),
+ ip varchar(32),
+ creator_name varchar(50),
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_login_status on sys_log_login(status);
+CREATE INDEX idx_login_create_date on sys_log_login(create_date);
+
+COMMENT ON TABLE sys_log_login IS '登录日志';
+COMMENT ON COLUMN sys_log_login.id IS 'id';
+COMMENT ON COLUMN sys_log_login.operation IS '用户操作 0:用户登录 1:用户退出';
+COMMENT ON COLUMN sys_log_login.status IS '状态 0:失败 1:成功 2:账号已锁定';
+COMMENT ON COLUMN sys_log_login.user_agent IS '用户代理';
+COMMENT ON COLUMN sys_log_login.ip IS '操作IP';
+COMMENT ON COLUMN sys_log_login.creator_name IS '用户名';
+COMMENT ON COLUMN sys_log_login.creator IS '创建者';
+COMMENT ON COLUMN sys_log_login.create_date IS '创建时间';
+
+
+create table sys_log_operation
+(
+ id bigint NOT NULL,
+ operation varchar(50),
+ request_uri varchar(200),
+ request_method varchar(20),
+ request_params text,
+ request_time int,
+ user_agent varchar(500),
+ ip varchar(32),
+ status int,
+ creator_name varchar(50),
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_operation_create_date on sys_log_operation(create_date);
+
+COMMENT ON TABLE sys_log_operation IS '操作日志';
+COMMENT ON COLUMN sys_log_operation.id IS 'id';
+COMMENT ON COLUMN sys_log_operation.operation IS '用户操作';
+COMMENT ON COLUMN sys_log_operation.request_uri IS '请求URI';
+COMMENT ON COLUMN sys_log_operation.request_method IS '请求方式';
+COMMENT ON COLUMN sys_log_operation.request_params IS '请求参数';
+COMMENT ON COLUMN sys_log_operation.request_time IS '请求时长(毫秒)';
+COMMENT ON COLUMN sys_log_operation.user_agent IS '用户代理';
+COMMENT ON COLUMN sys_log_operation.ip IS '操作IP';
+COMMENT ON COLUMN sys_log_operation.status IS '状态 0:失败 1:成功';
+COMMENT ON COLUMN sys_log_operation.creator_name IS '用户名';
+COMMENT ON COLUMN sys_log_operation.creator IS '创建者';
+COMMENT ON COLUMN sys_log_operation.create_date IS '创建时间';
+
+
+create table sys_log_error
+(
+ id bigint NOT NULL,
+ request_uri varchar(200),
+ request_method varchar(20),
+ request_params text,
+ user_agent varchar(500),
+ ip varchar(32),
+ error_info text,
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_error_create_date on sys_log_error(create_date);
+
+COMMENT ON TABLE sys_log_error IS '异常日志';
+COMMENT ON COLUMN sys_log_error.id IS 'id';
+COMMENT ON COLUMN sys_log_error.request_uri IS '请求URI';
+COMMENT ON COLUMN sys_log_error.request_method IS '请求方式';
+COMMENT ON COLUMN sys_log_error.request_params IS '请求参数';
+COMMENT ON COLUMN sys_log_error.user_agent IS '用户代理';
+COMMENT ON COLUMN sys_log_error.ip IS '操作IP';
+COMMENT ON COLUMN sys_log_error.error_info IS '异常信息';
+COMMENT ON COLUMN sys_log_error.creator IS '创建者';
+COMMENT ON COLUMN sys_log_error.create_date IS '创建时间';
+
+
+
+CREATE TABLE sys_oss (
+ id bigint NOT NULL,
+ url varchar(200),
+ creator bigint,
+ create_date datetime,
+ PRIMARY KEY (id)
+);
+CREATE INDEX idx_sys_oss_create_date on sys_oss(create_date);
+
+COMMENT ON TABLE sys_oss IS '文件上传';
+COMMENT ON COLUMN sys_oss.id IS 'id';
+COMMENT ON COLUMN sys_oss.url IS 'URL地址';
+COMMENT ON COLUMN sys_oss.creator IS '创建者';
+COMMENT ON COLUMN sys_oss.create_date IS '创建时间';
+
+
+CREATE TABLE schedule_job (
+ id bigint NOT NULL,
+ bean_name varchar(200),
+ params varchar(2000),
+ cron_expression varchar(100),
+ status int,
+ remark varchar(255),
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX idx_schedule_job_create_date on schedule_job(create_date);
+
+COMMENT ON TABLE schedule_job IS '定时任务';
+COMMENT ON COLUMN schedule_job.id IS 'id';
+COMMENT ON COLUMN schedule_job.bean_name IS 'spring bean名称';
+COMMENT ON COLUMN schedule_job.params IS '参数';
+COMMENT ON COLUMN schedule_job.cron_expression IS 'cron表达式';
+COMMENT ON COLUMN schedule_job.status IS '任务状态 0:暂停 1:正常';
+COMMENT ON COLUMN schedule_job.remark IS '备注';
+COMMENT ON COLUMN schedule_job.creator IS '创建者';
+COMMENT ON COLUMN schedule_job.create_date IS '创建时间';
+COMMENT ON COLUMN schedule_job.updater IS '更新者';
+COMMENT ON COLUMN schedule_job.update_date IS '更新时间';
+
+
+CREATE TABLE schedule_job_log (
+ id bigint NOT NULL,
+ job_id bigint NOT NULL,
+ bean_name varchar(200),
+ params varchar(2000),
+ status int,
+ error varchar(2000),
+ times int,
+ create_date datetime,
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX idx_job_log_job_id on schedule_job_log(job_id);
+CREATE INDEX idx_job_log_create_date on schedule_job_log(create_date);
+
+COMMENT ON TABLE schedule_job_log IS '定时任务日志';
+COMMENT ON COLUMN schedule_job_log.id IS 'id';
+COMMENT ON COLUMN schedule_job_log.bean_name IS 'spring bean名称';
+COMMENT ON COLUMN schedule_job_log.params IS '参数';
+COMMENT ON COLUMN schedule_job_log.status IS '任务状态 0:失败 1:成功';
+COMMENT ON COLUMN schedule_job_log.error IS '失败信息';
+COMMENT ON COLUMN schedule_job_log.times IS '耗时(单位:毫秒)';
+COMMENT ON COLUMN schedule_job.create_date IS '创建时间';
+
+
+CREATE TABLE sys_user_token (
+ id bigint NOT NULL,
+ user_id bigint,
+ token varchar(100),
+ expire_date datetime,
+ update_date datetime,
+ create_date datetime,
+ PRIMARY KEY (id)
+);
+
+CREATE UNIQUE INDEX uk_sys_user_token_user_id on sys_user_token(user_id);
+CREATE UNIQUE INDEX uk_sys_user_token on sys_user_token(token);
+
+COMMENT ON TABLE sys_user_token IS '系统用户Token';
+COMMENT ON COLUMN sys_user_token.id IS 'id';
+COMMENT ON COLUMN sys_user_token.user_id IS '用户id';
+COMMENT ON COLUMN sys_user_token.token IS '用户token';
+COMMENT ON COLUMN sys_user_token.expire_date IS '过期时间';
+COMMENT ON COLUMN sys_user_token.update_date IS '更新时间';
+COMMENT ON COLUMN sys_user_token.create_date IS '创建时间';
+
+
+
+-- 初始数据
+INSERT INTO sys_user(id, username, password, real_name, gender, email, mobile, status, dept_id, super_admin, creator, create_date, updater, update_date) VALUES (1067246875800000001, 'admin', '$2a$10$012Kx2ba5jzqr9gLlG4MX.bnQJTD9UWqF57XDo2N3.fPtLne02u/m', '管理员', 0, 'root@renren.io', '13612345678', 1, null, 1, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000002, 0, '权限管理', NULL, NULL, 0, 'icon-safetycertificate', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000003, 1067246875800000055, '新增', NULL, 'sys:user:save,sys:dept:list,sys:role:list', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000004, 1067246875800000055, '修改', NULL, 'sys:user:update,sys:dept:list,sys:role:list', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000005, 1067246875800000055, '删除', NULL, 'sys:user:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000006, 1067246875800000055, '导出', NULL, 'sys:user:export', 1, NULL, 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000007, 1067246875800000002, '角色管理', 'sys/role', NULL, 0, 'icon-team', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000008, 1067246875800000007, '查看', NULL, 'sys:role:page,sys:role:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000009, 1067246875800000007, '新增', NULL, 'sys:role:save,sys:menu:select,sys:dept:list', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000010, 1067246875800000007, '修改', NULL, 'sys:role:update,sys:menu:select,sys:dept:list', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000011, 1067246875800000007, '删除', NULL, 'sys:role:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000012, 1067246875800000002, '部门管理', 'sys/dept', NULL, 0, 'icon-apartment', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000014, 1067246875800000012, '查看', NULL, 'sys:dept:list,sys:dept:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000015, 1067246875800000012, '新增', NULL, 'sys:dept:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000016, 1067246875800000012, '修改', NULL, 'sys:dept:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000017, 1067246875800000012, '删除', NULL, 'sys:dept:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000025, 1067246875800000035, '菜单管理', 'sys/menu', NULL, 0, 'icon-unorderedlist', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000026, 1067246875800000025, '查看', NULL, 'sys:menu:list,sys:menu:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000027, 1067246875800000025, '新增', NULL, 'sys:menu:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000028, 1067246875800000025, '修改', NULL, 'sys:menu:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000029, 1067246875800000025, '删除', NULL, 'sys:menu:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000030, 1067246875800000035, '定时任务', 'job/schedule', NULL, 0, 'icon-dashboard', 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000031, 1067246875800000030, '查看', NULL, 'sys:schedule:page,sys:schedule:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000032, 1067246875800000030, '新增', NULL, 'sys:schedule:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000033, 1067246875800000030, '修改', NULL, 'sys:schedule:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000034, 1067246875800000030, '删除', NULL, 'sys:schedule:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000035, 0, '系统设置', NULL, NULL, 0, 'icon-setting', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000036, 1067246875800000030, '暂停', NULL, 'sys:schedule:pause', 1, NULL, 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000037, 1067246875800000030, '恢复', NULL, 'sys:schedule:resume', 1, NULL, 5, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000038, 1067246875800000030, '立即执行', NULL, 'sys:schedule:run', 1, NULL, 6, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000039, 1067246875800000030, '日志列表', NULL, 'sys:schedule:log', 1, NULL, 7, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000040, 1067246875800000035, '参数管理', 'sys/params', '', 0, 'icon-fileprotect', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000041, 1067246875800000035, '字典管理', 'sys/dict-type', NULL, 0, 'icon-golden-fill', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000042, 1067246875800000041, '查看', NULL, 'sys:dict:page,sys:dict:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000043, 1067246875800000041, '新增', NULL, 'sys:dict:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000044, 1067246875800000041, '修改', NULL, 'sys:dict:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000045, 1067246875800000041, '删除', NULL, 'sys:dict:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000046, 0, '日志管理', NULL, NULL, 0, 'icon-container', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000047, 1067246875800000035, '文件上传', 'oss/oss', 'sys:oss:all', 0, 'icon-upload', 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000048, 1067246875800000046, '登录日志', 'sys/log-login', 'sys:log:login', 0, 'icon-filedone', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000049, 1067246875800000046, '操作日志', 'sys/log-operation', 'sys:log:operation', 0, 'icon-solution', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000050, 1067246875800000046, '异常日志', 'sys/log-error', 'sys:log:error', 0, 'icon-file-exception', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000051, 1067246875800000053, 'SQL监控', '{{ApiUrl}}/druid/sql.html', NULL, 0, 'icon-database', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000053, 0, '系统监控', NULL, NULL, 0, 'icon-desktop', 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000055, 1067246875800000002, '用户管理', 'sys/user', NULL, 0, 'icon-user', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000056, 1067246875800000055, '查看', NULL, 'sys:user:page,sys:user:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000057, 1067246875800000040, '新增', NULL, 'sys:params:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000058, 1067246875800000040, '导出', NULL, 'sys:params:export', 1, NULL, 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000059, 1067246875800000040, '查看', '', 'sys:params:page,sys:params:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000060, 1067246875800000040, '修改', NULL, 'sys:params:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000061, 1067246875800000040, '删除', '', 'sys:params:delete', 1, '', 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1156748733921165314, 1067246875800000053, '接口文档', '{{ApiUrl}}/doc.html', '', 0, 'icon-file-word', 1, 1067246875800000001, now(), 1067246875800000001, now());
+
+
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000062, 1067246875800000063, '1067246875800000066,1067246875800000063', '技术部', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000063, 1067246875800000066, '1067246875800000066', '长沙分公司', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000064, 1067246875800000066, '1067246875800000066', '上海分公司', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000065, 1067246875800000064, '1067246875800000066,1067246875800000064', '市场部', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000066, 0, '0', '人人开源集团', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000067, 1067246875800000064, '1067246875800000066,1067246875800000064', '销售部', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000068, 1067246875800000063, '1067246875800000066,1067246875800000063', '产品部', 1, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1160061077912858625, 'gender', '性别', '', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061112075464705, 1160061077912858625, '男', '0', '', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061146967879681, 1160061077912858625, '女', '1', '', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061190127267841, 1160061077912858625, '保密', '2', '', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1225813644059140097, 'notice_type', '站内通知-类型', '', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814069634195457, 1225813644059140097, '公告', '0', '', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814107559092225, 1225813644059140097, '会议', '1', '', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814271879340034, 1225813644059140097, '其他', '2', '', 2, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_params(id, param_code, param_value, param_type, remark, creator, create_date, updater, update_date) VALUES (1067246875800000073, 'CLOUD_STORAGE_CONFIG_KEY', '{"type":1,"qiniuDomain":"http://test.oss.renren.io","qiniuPrefix":"upload","qiniuAccessKey":"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ","qiniuSecretKey":"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV","qiniuBucketName":"renren-oss","aliyunDomain":"","aliyunPrefix":"","aliyunEndPoint":"","aliyunAccessKeyId":"","aliyunAccessKeySecret":"","aliyunBucketName":"","qcloudDomain":"","qcloudPrefix":"","qcloudSecretId":"","qcloudSecretKey":"","qcloudBucketName":""}', '0', '云存储配置信息', 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO schedule_job (id, bean_name, params, cron_expression, status, remark, creator, create_date, updater, update_date) VALUES (1067246875800000076, 'testTask', 'renren', '0 0/30 * * * ?', 0, '有参测试,多个参数使用json', 1067246875800000001, now(), 1067246875800000001, now());
+
+
+
+
+-- quartz自带表结构
+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_SIMPLE_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_SIMPROP_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;
+
+create table QRTZ_JOB_DETAILS (
+ sched_name varchar(120) not null,
+ job_name varchar(200) not null,
+ job_group varchar(200) not null,
+ description varchar(250) 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 blob null,
+ primary key (sched_name, job_name, job_group)
+);
+
+create table QRTZ_TRIGGERS (
+ sched_name varchar(120) not null,
+ trigger_name varchar(200) not null,
+ trigger_group varchar(200) not null,
+ job_name varchar(200) not null,
+ job_group varchar(200) not null,
+ description varchar(250) null,
+ next_fire_time bigint null,
+ prev_fire_time bigint null,
+ priority int null,
+ trigger_state varchar(16) not null,
+ trigger_type varchar(8) not null,
+ start_time bigint not null,
+ end_time bigint null,
+ calendar_name varchar(200) null,
+ misfire_instr int null,
+ job_data blob 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 varchar(120) not null,
+ trigger_name varchar(200) not null,
+ trigger_group varchar(200) 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)
+);
+
+create table QRTZ_CRON_TRIGGERS (
+ sched_name varchar(120) not null,
+ trigger_name varchar(200) not null,
+ trigger_group varchar(200) not null,
+ cron_expression varchar(200) not null,
+ time_zone_id varchar(80),
+ 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)
+);
+
+create table QRTZ_BLOB_TRIGGERS (
+ sched_name varchar(120) not null,
+ trigger_name varchar(200) not null,
+ trigger_group varchar(200) not null,
+ blob_data blob 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)
+);
+
+create table QRTZ_CALENDARS (
+ sched_name varchar(120) not null,
+ calendar_name varchar(200) not null,
+ calendar blob not null,
+ primary key (sched_name, calendar_name)
+);
+
+create table QRTZ_PAUSED_TRIGGER_GRPS (
+ sched_name varchar(120) not null,
+ trigger_group varchar(200) not null,
+ primary key (sched_name, trigger_group)
+);
+
+create table QRTZ_FIRED_TRIGGERS (
+ sched_name varchar(120) not null,
+ entry_id varchar(95) not null,
+ trigger_name varchar(200) not null,
+ trigger_group varchar(200) not null,
+ instance_name varchar(200) not null,
+ fired_time bigint not null,
+ sched_time bigint not null,
+ priority int not null,
+ state varchar(16) not null,
+ job_name varchar(200) null,
+ job_group varchar(200) null,
+ is_nonconcurrent varchar(1) null,
+ requests_recovery varchar(1) null,
+ primary key (sched_name, entry_id)
+);
+
+create table QRTZ_SCHEDULER_STATE (
+ sched_name varchar(120) not null,
+ instance_name varchar(200) 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 varchar(120) not null,
+ lock_name varchar(40) not null,
+ primary key (sched_name, lock_name)
+);
+
+create table QRTZ_SIMPROP_TRIGGERS (
+ sched_name varchar(120) not null,
+ trigger_name varchar(200) not null,
+ trigger_group varchar(200) not null,
+ str_prop_1 varchar(512) null,
+ str_prop_2 varchar(512) null,
+ str_prop_3 varchar(512) null,
+ int_prop_1 int null,
+ int_prop_2 int null,
+ long_prop_1 bigint null,
+ long_prop_2 bigint null,
+ dec_prop_1 numeric(13,4) null,
+ dec_prop_2 numeric(13,4) null,
+ bool_prop_1 varchar(1) null,
+ bool_prop_2 varchar(1) 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)
+);
\ No newline at end of file
diff --git a/bdty-admin/db/mysql.sql b/bdty-admin/db/mysql.sql
new file mode 100644
index 0000000..1f9c9e3
--- /dev/null
+++ b/bdty-admin/db/mysql.sql
@@ -0,0 +1,504 @@
+-- 系统用户
+CREATE TABLE sys_user (
+ id bigint NOT NULL COMMENT 'id',
+ username varchar(50) NOT NULL COMMENT '用户名',
+ password varchar(100) COMMENT '密码',
+ real_name varchar(50) COMMENT '姓名',
+ head_url varchar(200) COMMENT '头像',
+ gender tinyint unsigned COMMENT '性别 0:男 1:女 2:保密',
+ email varchar(100) COMMENT '邮箱',
+ mobile varchar(100) COMMENT '手机号',
+ dept_id bigint COMMENT '部门ID',
+ super_admin tinyint unsigned COMMENT '超级管理员 0:否 1:是',
+ status tinyint COMMENT '状态 0:停用 1:正常',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ updater bigint COMMENT '更新者',
+ update_date datetime COMMENT '更新时间',
+ primary key (id),
+ unique key uk_username (username),
+ key idx_create_date (create_date)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户';
+
+-- 部门
+CREATE TABLE sys_dept (
+ id bigint NOT NULL COMMENT 'id',
+ pid bigint COMMENT '上级ID',
+ pids varchar(500) COMMENT '所有上级ID,用逗号分开',
+ name varchar(50) COMMENT '部门名称',
+ sort int unsigned COMMENT '排序',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ updater bigint COMMENT '更新者',
+ update_date datetime COMMENT '更新时间',
+ primary key (id),
+ key idx_pid (pid),
+ key idx_sort (sort)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门管理';
+
+-- 角色管理
+create table sys_role
+(
+ id bigint NOT NULL COMMENT 'id',
+ name varchar(50) COMMENT '角色名称',
+ remark varchar(100) COMMENT '备注',
+ dept_id bigint COMMENT '部门ID',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ updater bigint COMMENT '更新者',
+ update_date datetime COMMENT '更新时间',
+ primary key (id),
+ key idx_dept_id (dept_id)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='角色管理';
+
+-- 菜单管理
+create table sys_menu
+(
+ id bigint NOT NULL COMMENT 'id',
+ pid bigint COMMENT '上级ID,一级菜单为0',
+ name varchar(200) COMMENT '名称',
+ url varchar(200) COMMENT '菜单URL',
+ permissions varchar(500) COMMENT '授权(多个用逗号分隔,如:sys:user:list,sys:user:save)',
+ menu_type tinyint unsigned COMMENT '类型 0:菜单 1:按钮',
+ icon varchar(50) COMMENT '菜单图标',
+ sort int COMMENT '排序',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ updater bigint COMMENT '更新者',
+ update_date datetime COMMENT '更新时间',
+ primary key (id),
+ key idx_pid (pid),
+ key idx_sort (sort)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='菜单管理';
+
+-- 角色用户关系
+create table sys_role_user
+(
+ id bigint NOT NULL COMMENT 'id',
+ role_id bigint COMMENT '角色ID',
+ user_id bigint COMMENT '用户ID',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ primary key (id),
+ key idx_role_id (role_id),
+ key idx_user_id (user_id)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='角色用户关系';
+
+-- 角色菜单关系
+create table sys_role_menu
+(
+ id bigint NOT NULL COMMENT 'id',
+ role_id bigint COMMENT '角色ID',
+ menu_id bigint COMMENT '菜单ID',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ primary key (id),
+ key idx_role_id (role_id),
+ key idx_menu_id (menu_id)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='角色菜单关系';
+
+-- 角色数据权限
+create table sys_role_data_scope
+(
+ id bigint NOT NULL COMMENT 'id',
+ role_id bigint COMMENT '角色ID',
+ dept_id bigint COMMENT '部门ID',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ primary key (id),
+ key idx_role_id (role_id)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='角色数据权限';
+
+-- 参数管理
+create table sys_params
+(
+ id bigint NOT NULL COMMENT 'id',
+ param_code varchar(32) COMMENT '参数编码',
+ param_value varchar(2000) COMMENT '参数值',
+ param_type tinyint unsigned default 1 COMMENT '类型 0:系统参数 1:非系统参数',
+ remark varchar(200) COMMENT '备注',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ updater bigint COMMENT '更新者',
+ update_date datetime COMMENT '更新时间',
+ primary key (id),
+ unique key uk_param_code (param_code),
+ key idx_create_date (create_date)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='参数管理';
+
+-- 字典类型
+create table sys_dict_type
+(
+ id bigint NOT NULL COMMENT 'id',
+ dict_type varchar(100) NOT NULL COMMENT '字典类型',
+ dict_name varchar(255) NOT NULL COMMENT '字典名称',
+ remark varchar(255) COMMENT '备注',
+ sort int unsigned COMMENT '排序',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ updater bigint COMMENT '更新者',
+ update_date datetime COMMENT '更新时间',
+ primary key (id),
+ UNIQUE KEY(dict_type)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='字典类型';
+
+-- 字典数据
+create table sys_dict_data
+(
+ id bigint NOT NULL COMMENT 'id',
+ dict_type_id bigint NOT NULL COMMENT '字典类型ID',
+ dict_label varchar(255) NOT NULL COMMENT '字典标签',
+ dict_value varchar(255) COMMENT '字典值',
+ remark varchar(255) COMMENT '备注',
+ sort int unsigned COMMENT '排序',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ updater bigint COMMENT '更新者',
+ update_date datetime COMMENT '更新时间',
+ primary key (id),
+ unique key uk_dict_type_value (dict_type_id, dict_value),
+ key idx_sort (sort)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='字典数据';
+
+-- 登录日志
+create table sys_log_login
+(
+ id bigint NOT NULL COMMENT 'id',
+ operation tinyint unsigned COMMENT '用户操作 0:用户登录 1:用户退出',
+ status tinyint unsigned NOT NULL COMMENT '状态 0:失败 1:成功 2:账号已锁定',
+ user_agent varchar(500) COMMENT '用户代理',
+ ip varchar(32) COMMENT '操作IP',
+ creator_name varchar(50) COMMENT '用户名',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ primary key (id),
+ key idx_status (status),
+ key idx_create_date (create_date)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='登录日志';
+
+-- 操作日志
+create table sys_log_operation
+(
+ id bigint NOT NULL COMMENT 'id',
+ operation varchar(50) COMMENT '用户操作',
+ request_uri varchar(200) COMMENT '请求URI',
+ request_method varchar(20) COMMENT '请求方式',
+ request_params text COMMENT '请求参数',
+ request_time int unsigned NOT NULL COMMENT '请求时长(毫秒)',
+ user_agent varchar(500) COMMENT '用户代理',
+ ip varchar(32) COMMENT '操作IP',
+ status tinyint unsigned NOT NULL COMMENT '状态 0:失败 1:成功',
+ creator_name varchar(50) COMMENT '用户名',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ primary key (id),
+ key idx_create_date (create_date)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='操作日志';
+
+-- 异常日志
+create table sys_log_error
+(
+ id bigint NOT NULL COMMENT 'id',
+ request_uri varchar(200) COMMENT '请求URI',
+ request_method varchar(20) COMMENT '请求方式',
+ request_params text COMMENT '请求参数',
+ user_agent varchar(500) COMMENT '用户代理',
+ ip varchar(32) COMMENT '操作IP',
+ error_info text COMMENT '异常信息',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ primary key (id),
+ key idx_create_date (create_date)
+)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='异常日志';
+
+
+-- 文件上传
+CREATE TABLE sys_oss (
+ id bigint NOT NULL COMMENT 'id',
+ url varchar(200) COMMENT 'URL地址',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ PRIMARY KEY (id),
+ key idx_create_date (create_date)
+) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='文件上传';
+
+-- 定时任务
+CREATE TABLE schedule_job (
+ id bigint NOT NULL COMMENT 'id',
+ bean_name varchar(200) DEFAULT NULL COMMENT 'spring bean名称',
+ params varchar(2000) DEFAULT NULL COMMENT '参数',
+ cron_expression varchar(100) DEFAULT NULL COMMENT 'cron表达式',
+ status tinyint unsigned COMMENT '任务状态 0:暂停 1:正常',
+ remark varchar(255) DEFAULT NULL COMMENT '备注',
+ creator bigint COMMENT '创建者',
+ create_date datetime COMMENT '创建时间',
+ updater bigint COMMENT '更新者',
+ update_date datetime COMMENT '更新时间',
+ PRIMARY KEY (id),
+ key idx_create_date (create_date)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定时任务';
+
+-- 定时任务日志
+CREATE TABLE schedule_job_log (
+ id bigint NOT NULL COMMENT 'id',
+ job_id bigint NOT NULL COMMENT '任务id',
+ bean_name varchar(200) DEFAULT NULL COMMENT 'spring bean名称',
+ params varchar(2000) DEFAULT NULL COMMENT '参数',
+ status tinyint unsigned NOT NULL COMMENT '任务状态 0:失败 1:成功',
+ error varchar(2000) DEFAULT NULL COMMENT '失败信息',
+ times int NOT NULL COMMENT '耗时(单位:毫秒)',
+ create_date datetime COMMENT '创建时间',
+ PRIMARY KEY (id),
+ key idx_job_id (job_id),
+ key idx_create_date (create_date)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志';
+
+-- 系统用户Token
+CREATE TABLE sys_user_token (
+ id bigint NOT NULL COMMENT 'id',
+ user_id bigint NOT NULL COMMENT '用户id',
+ token varchar(100) NOT NULL COMMENT '用户token',
+ expire_date datetime COMMENT '过期时间',
+ update_date datetime COMMENT '更新时间',
+ create_date datetime COMMENT '创建时间',
+ PRIMARY KEY (id),
+ UNIQUE KEY user_id (user_id),
+ UNIQUE KEY token (token)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户Token';
+
+-- 初始数据
+INSERT INTO sys_user(id, username, password, real_name, gender, email, mobile, status, dept_id, super_admin, creator, create_date, updater, update_date) VALUES (1067246875800000001, 'admin', '$2a$10$012Kx2ba5jzqr9gLlG4MX.bnQJTD9UWqF57XDo2N3.fPtLne02u/m', '管理员', 0, 'root@renren.io', '13612345678', 1, null, 1, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000002, 0, '权限管理', NULL, NULL, 0, 'icon-safetycertificate', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000003, 1067246875800000055, '新增', NULL, 'sys:user:save,sys:dept:list,sys:role:list', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000004, 1067246875800000055, '修改', NULL, 'sys:user:update,sys:dept:list,sys:role:list', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000005, 1067246875800000055, '删除', NULL, 'sys:user:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000006, 1067246875800000055, '导出', NULL, 'sys:user:export', 1, NULL, 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000007, 1067246875800000002, '角色管理', 'sys/role', NULL, 0, 'icon-team', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000008, 1067246875800000007, '查看', NULL, 'sys:role:page,sys:role:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000009, 1067246875800000007, '新增', NULL, 'sys:role:save,sys:menu:select,sys:dept:list', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000010, 1067246875800000007, '修改', NULL, 'sys:role:update,sys:menu:select,sys:dept:list', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000011, 1067246875800000007, '删除', NULL, 'sys:role:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000012, 1067246875800000002, '部门管理', 'sys/dept', NULL, 0, 'icon-apartment', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000014, 1067246875800000012, '查看', NULL, 'sys:dept:list,sys:dept:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000015, 1067246875800000012, '新增', NULL, 'sys:dept:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000016, 1067246875800000012, '修改', NULL, 'sys:dept:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000017, 1067246875800000012, '删除', NULL, 'sys:dept:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000025, 1067246875800000035, '菜单管理', 'sys/menu', NULL, 0, 'icon-unorderedlist', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000026, 1067246875800000025, '查看', NULL, 'sys:menu:list,sys:menu:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000027, 1067246875800000025, '新增', NULL, 'sys:menu:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000028, 1067246875800000025, '修改', NULL, 'sys:menu:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000029, 1067246875800000025, '删除', NULL, 'sys:menu:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000030, 1067246875800000035, '定时任务', 'job/schedule', NULL, 0, 'icon-dashboard', 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000031, 1067246875800000030, '查看', NULL, 'sys:schedule:page,sys:schedule:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000032, 1067246875800000030, '新增', NULL, 'sys:schedule:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000033, 1067246875800000030, '修改', NULL, 'sys:schedule:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000034, 1067246875800000030, '删除', NULL, 'sys:schedule:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000035, 0, '系统设置', NULL, NULL, 0, 'icon-setting', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000036, 1067246875800000030, '暂停', NULL, 'sys:schedule:pause', 1, NULL, 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000037, 1067246875800000030, '恢复', NULL, 'sys:schedule:resume', 1, NULL, 5, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000038, 1067246875800000030, '立即执行', NULL, 'sys:schedule:run', 1, NULL, 6, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000039, 1067246875800000030, '日志列表', NULL, 'sys:schedule:log', 1, NULL, 7, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000040, 1067246875800000035, '参数管理', 'sys/params', '', 0, 'icon-fileprotect', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000041, 1067246875800000035, '字典管理', 'sys/dict-type', NULL, 0, 'icon-golden-fill', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000042, 1067246875800000041, '查看', NULL, 'sys:dict:page,sys:dict:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000043, 1067246875800000041, '新增', NULL, 'sys:dict:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000044, 1067246875800000041, '修改', NULL, 'sys:dict:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000045, 1067246875800000041, '删除', NULL, 'sys:dict:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000046, 0, '日志管理', NULL, NULL, 0, 'icon-container', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000047, 1067246875800000035, '文件上传', 'oss/oss', 'sys:oss:all', 0, 'icon-upload', 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000048, 1067246875800000046, '登录日志', 'sys/log-login', 'sys:log:login', 0, 'icon-filedone', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000049, 1067246875800000046, '操作日志', 'sys/log-operation', 'sys:log:operation', 0, 'icon-solution', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000050, 1067246875800000046, '异常日志', 'sys/log-error', 'sys:log:error', 0, 'icon-file-exception', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000051, 1067246875800000053, 'SQL监控', '{{ApiUrl}}/druid/sql.html', NULL, 0, 'icon-database', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000053, 0, '系统监控', NULL, NULL, 0, 'icon-desktop', 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000055, 1067246875800000002, '用户管理', 'sys/user', NULL, 0, 'icon-user', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000056, 1067246875800000055, '查看', NULL, 'sys:user:page,sys:user:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000057, 1067246875800000040, '新增', NULL, 'sys:params:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000058, 1067246875800000040, '导出', NULL, 'sys:params:export', 1, NULL, 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000059, 1067246875800000040, '查看', '', 'sys:params:page,sys:params:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000060, 1067246875800000040, '修改', NULL, 'sys:params:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000061, 1067246875800000040, '删除', '', 'sys:params:delete', 1, '', 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1156748733921165314, 1067246875800000053, '接口文档', '{{ApiUrl}}/doc.html', '', 0, 'icon-file-word', 1, 1067246875800000001, now(), 1067246875800000001, now());
+
+
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000062, 1067246875800000063, '1067246875800000066,1067246875800000063', '技术部', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000063, 1067246875800000066, '1067246875800000066', '长沙分公司', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000064, 1067246875800000066, '1067246875800000066', '上海分公司', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000065, 1067246875800000064, '1067246875800000066,1067246875800000064', '市场部', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000066, 0, '0', '人人开源集团', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000067, 1067246875800000064, '1067246875800000066,1067246875800000064', '销售部', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000068, 1067246875800000063, '1067246875800000066,1067246875800000063', '产品部', 1, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1160061077912858625, 'gender', '性别', '', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061112075464705, 1160061077912858625, '男', '0', '', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061146967879681, 1160061077912858625, '女', '1', '', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061190127267841, 1160061077912858625, '保密', '2', '', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1225813644059140097, 'notice_type', '站内通知-类型', '', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814069634195457, 1225813644059140097, '公告', '0', '', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814107559092225, 1225813644059140097, '会议', '1', '', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814271879340034, 1225813644059140097, '其他', '2', '', 2, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_params(id, param_code, param_value, param_type, remark, creator, create_date, updater, update_date) VALUES (1067246875800000073, 'CLOUD_STORAGE_CONFIG_KEY', '{"type":1,"qiniuDomain":"http://test.oss.renren.io","qiniuPrefix":"upload","qiniuAccessKey":"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ","qiniuSecretKey":"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV","qiniuBucketName":"renren-oss","aliyunDomain":"","aliyunPrefix":"","aliyunEndPoint":"","aliyunAccessKeyId":"","aliyunAccessKeySecret":"","aliyunBucketName":"","qcloudDomain":"","qcloudPrefix":"","qcloudSecretId":"","qcloudSecretKey":"","qcloudBucketName":""}', '0', '云存储配置信息', 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO schedule_job (id, bean_name, params, cron_expression, status, remark, creator, create_date, updater, update_date) VALUES (1067246875800000076, 'testTask', 'renren', '0 0/30 * * * ?', 0, '有参测试,多个参数使用json', 1067246875800000001, now(), 1067246875800000001, now());
+
+
+-- quartz自带表结构
+CREATE TABLE QRTZ_JOB_DETAILS(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ JOB_NAME VARCHAR(200) NOT NULL,
+ JOB_GROUP VARCHAR(200) NOT NULL,
+ DESCRIPTION VARCHAR(250) 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 BLOB NULL,
+ PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_TRIGGERS (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ JOB_NAME VARCHAR(200) NOT NULL,
+ JOB_GROUP VARCHAR(200) NOT NULL,
+ DESCRIPTION VARCHAR(250) NULL,
+ NEXT_FIRE_TIME BIGINT(13) NULL,
+ PREV_FIRE_TIME BIGINT(13) NULL,
+ PRIORITY INTEGER NULL,
+ TRIGGER_STATE VARCHAR(16) NOT NULL,
+ TRIGGER_TYPE VARCHAR(8) NOT NULL,
+ START_TIME BIGINT(13) NOT NULL,
+ END_TIME BIGINT(13) NULL,
+ CALENDAR_NAME VARCHAR(200) NULL,
+ MISFIRE_INSTR SMALLINT(2) NULL,
+ JOB_DATA BLOB 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))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ REPEAT_COUNT BIGINT(7) NOT NULL,
+ REPEAT_INTERVAL BIGINT(12) NOT NULL,
+ TIMES_TRIGGERED BIGINT(10) 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))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_CRON_TRIGGERS (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ CRON_EXPRESSION VARCHAR(120) NOT NULL,
+ TIME_ZONE_ID VARCHAR(80),
+ 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))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_SIMPROP_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ STR_PROP_1 VARCHAR(512) NULL,
+ STR_PROP_2 VARCHAR(512) NULL,
+ STR_PROP_3 VARCHAR(512) NULL,
+ INT_PROP_1 INT NULL,
+ INT_PROP_2 INT NULL,
+ LONG_PROP_1 BIGINT NULL,
+ LONG_PROP_2 BIGINT NULL,
+ DEC_PROP_1 NUMERIC(13,4) NULL,
+ DEC_PROP_2 NUMERIC(13,4) NULL,
+ BOOL_PROP_1 VARCHAR(1) NULL,
+ BOOL_PROP_2 VARCHAR(1) 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))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_BLOB_TRIGGERS (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ BLOB_DATA BLOB NULL,
+ PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+ INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+ REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_CALENDARS (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ CALENDAR_NAME VARCHAR(200) NOT NULL,
+ CALENDAR BLOB NOT NULL,
+ PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_FIRED_TRIGGERS (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ ENTRY_ID VARCHAR(95) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ INSTANCE_NAME VARCHAR(200) NOT NULL,
+ FIRED_TIME BIGINT(13) NOT NULL,
+ SCHED_TIME BIGINT(13) NOT NULL,
+ PRIORITY INTEGER NOT NULL,
+ STATE VARCHAR(16) NOT NULL,
+ JOB_NAME VARCHAR(200) NULL,
+ JOB_GROUP VARCHAR(200) NULL,
+ IS_NONCONCURRENT VARCHAR(1) NULL,
+ REQUESTS_RECOVERY VARCHAR(1) NULL,
+ PRIMARY KEY (SCHED_NAME,ENTRY_ID))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_SCHEDULER_STATE (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ INSTANCE_NAME VARCHAR(200) NOT NULL,
+ LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
+ CHECKIN_INTERVAL BIGINT(13) NOT NULL,
+ PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE QRTZ_LOCKS (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ LOCK_NAME VARCHAR(40) NOT NULL,
+ PRIMARY KEY (SCHED_NAME,LOCK_NAME))
+ ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+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);
\ No newline at end of file
diff --git a/bdty-admin/db/oracle.sql b/bdty-admin/db/oracle.sql
new file mode 100644
index 0000000..8f36a16
--- /dev/null
+++ b/bdty-admin/db/oracle.sql
@@ -0,0 +1,684 @@
+CREATE TABLE sys_user (
+ id NUMBER(20, 0) NOT NULL,
+ username varchar2(50) NOT NULL,
+ password varchar2(100),
+ real_name varchar2(50),
+ head_url varchar2(200),
+ gender NUMBER(2, 0),
+ email varchar2(100),
+ mobile varchar2(100),
+ dept_id NUMBER(20, 0),
+ super_admin NUMBER(2, 0),
+ status NUMBER(2, 0),
+ creator NUMBER(20, 0),
+ create_date date,
+ updater NUMBER(20, 0),
+ update_date date,
+ primary key (id)
+);
+
+CREATE UNIQUE INDEX uk_sys_user_username on sys_user(username);
+CREATE INDEX idx_sys_user_create_date on sys_user(create_date);
+
+COMMENT ON TABLE sys_user IS '用户管理';
+COMMENT ON COLUMN sys_user.id IS 'id';
+COMMENT ON COLUMN sys_user.username IS '用户名';
+COMMENT ON COLUMN sys_user.password IS '密码';
+COMMENT ON COLUMN sys_user.real_name IS '姓名';
+COMMENT ON COLUMN sys_user.head_url IS '头像';
+COMMENT ON COLUMN sys_user.gender IS '性别 0:男 1:女 2:保密';
+COMMENT ON COLUMN sys_user.email IS '邮箱';
+COMMENT ON COLUMN sys_user.mobile IS '手机号';
+COMMENT ON COLUMN sys_user.dept_id IS '部门ID';
+COMMENT ON COLUMN sys_user.super_admin IS '超级管理员 0:否 1:是';
+COMMENT ON COLUMN sys_user.status IS '状态 0:停用 1:正常';
+COMMENT ON COLUMN sys_user.creator IS '创建者';
+COMMENT ON COLUMN sys_user.create_date IS '创建时间';
+COMMENT ON COLUMN sys_user.updater IS '更新者';
+COMMENT ON COLUMN sys_user.update_date IS '更新时间';
+
+
+CREATE TABLE sys_dept (
+ id NUMBER(20, 0) NOT NULL,
+ pid NUMBER(20, 0),
+ pids varchar2(500),
+ name varchar2(50),
+ sort NUMBER(10, 0),
+ creator NUMBER(20, 0),
+ create_date date,
+ updater NUMBER(20, 0),
+ update_date date,
+ primary key (id)
+);
+CREATE INDEX idx_sys_dept_pid on sys_dept(pid);
+CREATE INDEX idx_sys_dept_idx_sort on sys_dept(sort);
+
+COMMENT ON TABLE sys_dept IS '部门管理';
+COMMENT ON COLUMN sys_dept.id IS 'id';
+COMMENT ON COLUMN sys_dept.pid IS '上级ID';
+COMMENT ON COLUMN sys_dept.pids IS '所有上级ID,用逗号分开';
+COMMENT ON COLUMN sys_dept.name IS '部门名称';
+COMMENT ON COLUMN sys_dept.sort IS '排序';
+COMMENT ON COLUMN sys_dept.creator IS '创建者';
+COMMENT ON COLUMN sys_dept.create_date IS '创建时间';
+COMMENT ON COLUMN sys_dept.updater IS '更新者';
+COMMENT ON COLUMN sys_dept.update_date IS '更新时间';
+
+
+create table sys_role
+(
+ id NUMBER(20, 0) NOT NULL,
+ name varchar2(32),
+ remark varchar2(100),
+ dept_id NUMBER(20, 0),
+ creator NUMBER(20, 0),
+ create_date date,
+ updater NUMBER(20, 0),
+ update_date date,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_dept_id on sys_role(dept_id);
+
+COMMENT ON TABLE sys_role IS '角色管理';
+COMMENT ON COLUMN sys_role.id IS 'id';
+COMMENT ON COLUMN sys_role.name IS '角色名称';
+COMMENT ON COLUMN sys_role.remark IS '备注';
+COMMENT ON COLUMN sys_role.dept_id IS '部门ID';
+COMMENT ON COLUMN sys_role.creator IS '创建者';
+COMMENT ON COLUMN sys_role.create_date IS '创建时间';
+COMMENT ON COLUMN sys_role.updater IS '更新者';
+COMMENT ON COLUMN sys_role.update_date IS '更新时间';
+
+
+create table sys_menu
+(
+ id NUMBER(20, 0) NOT NULL,
+ pid NUMBER(20, 0),
+ name varchar2(200),
+ url varchar2(200),
+ permissions varchar2(500),
+ menu_type NUMBER(2, 0),
+ icon varchar2(50),
+ sort NUMBER(10, 0),
+ creator NUMBER(20, 0),
+ create_date date,
+ updater NUMBER(20, 0),
+ update_date date,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_menu_pid on sys_menu(pid);
+CREATE INDEX idx_sys_menu_sort on sys_menu(sort);
+
+COMMENT ON TABLE sys_menu IS '菜单管理';
+COMMENT ON COLUMN sys_menu.id IS 'id';
+COMMENT ON COLUMN sys_menu.pid IS '上级ID,一级菜单为0';
+COMMENT ON COLUMN sys_menu.name IS '名称';
+COMMENT ON COLUMN sys_menu.url IS '菜单URL';
+COMMENT ON COLUMN sys_menu.permissions IS '授权(多个用逗号分隔,如:sys:user:list,sys:user:save)';
+COMMENT ON COLUMN sys_menu.menu_type IS '类型 0:菜单 1:按钮';
+COMMENT ON COLUMN sys_menu.icon IS '菜单图标';
+COMMENT ON COLUMN sys_menu.sort IS '排序';
+COMMENT ON COLUMN sys_menu.creator IS '创建者';
+COMMENT ON COLUMN sys_menu.create_date IS '创建时间';
+COMMENT ON COLUMN sys_menu.updater IS '更新者';
+COMMENT ON COLUMN sys_menu.update_date IS '更新时间';
+
+
+create table sys_role_user
+(
+ id varchar2(32) NOT NULL,
+ role_id varchar2(32),
+ user_id varchar2(32),
+ creator varchar2(32),
+ create_date date,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_user_role_id on sys_role_user(role_id);
+CREATE INDEX idx_sys_role_user_user_id on sys_role_user(user_id);
+
+COMMENT ON TABLE sys_role_user IS '角色用户关系';
+COMMENT ON COLUMN sys_role_user.role_id IS '角色ID';
+COMMENT ON COLUMN sys_role_user.user_id IS '用户ID';
+COMMENT ON COLUMN sys_role_user.creator IS '创建者';
+COMMENT ON COLUMN sys_role_user.create_date IS '创建时间';
+
+
+create table sys_role_menu
+(
+ id NUMBER(20, 0) NOT NULL,
+ role_id NUMBER(20, 0),
+ menu_id NUMBER(20, 0),
+ creator NUMBER(20, 0),
+ create_date date,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_menu_role_id on sys_role_menu(role_id);
+CREATE INDEX idx_sys_role_menu_menu_id on sys_role_menu(menu_id);
+
+COMMENT ON TABLE sys_role_menu IS '角色菜单关系';
+COMMENT ON COLUMN sys_role_menu.role_id IS '角色ID';
+COMMENT ON COLUMN sys_role_menu.menu_id IS '菜单ID';
+COMMENT ON COLUMN sys_role_menu.creator IS '创建者';
+COMMENT ON COLUMN sys_role_menu.create_date IS '创建时间';
+
+
+create table sys_role_data_scope
+(
+ id NUMBER(20, 0) NOT NULL,
+ role_id NUMBER(20, 0),
+ dept_id NUMBER(20, 0),
+ creator NUMBER(20, 0),
+ create_date date,
+ primary key (id)
+);
+CREATE INDEX idx_data_scope_role_id on sys_role_data_scope(role_id);
+
+COMMENT ON TABLE sys_role_data_scope IS '角色数据权限';
+COMMENT ON COLUMN sys_role_data_scope.role_id IS '角色ID';
+COMMENT ON COLUMN sys_role_data_scope.dept_id IS '部门ID';
+COMMENT ON COLUMN sys_role_data_scope.creator IS '创建者';
+COMMENT ON COLUMN sys_role_data_scope.create_date IS '创建时间';
+
+
+create table sys_params
+(
+ id NUMBER(20, 0) NOT NULL,
+ param_code varchar2(32),
+ param_value varchar2(2000),
+ param_type NUMBER(2, 0) DEFAULT 1 NOT NULL,
+ remark varchar2(200),
+ creator NUMBER(20, 0),
+ create_date date,
+ updater NUMBER(20, 0),
+ update_date date,
+ primary key (id)
+);
+CREATE UNIQUE INDEX uk_sys_params_param_code on sys_params(param_code);
+CREATE INDEX idx_sys_params_create_date on sys_params(create_date);
+
+COMMENT ON TABLE sys_params IS '参数管理';
+COMMENT ON COLUMN sys_params.param_code IS '参数编码';
+COMMENT ON COLUMN sys_params.param_value IS '参数值';
+COMMENT ON COLUMN sys_params.param_type IS '类型 0:系统参数 1:非系统参数';
+COMMENT ON COLUMN sys_params.remark IS '备注';
+COMMENT ON COLUMN sys_params.creator IS '创建者';
+COMMENT ON COLUMN sys_params.create_date IS '创建时间';
+COMMENT ON COLUMN sys_params.updater IS '更新者';
+COMMENT ON COLUMN sys_params.update_date IS '更新时间';
+
+
+create table sys_dict_type
+(
+ id NUMBER(20, 0) NOT NULL,
+ dict_type varchar2(100),
+ dict_name varchar2(255),
+ remark varchar2(255),
+ sort NUMBER(10, 0),
+ creator NUMBER(20, 0),
+ create_date date,
+ updater NUMBER(20, 0),
+ update_date date,
+ primary key (id)
+);
+CREATE UNIQUE INDEX uk_sys_dict_type_dict_type on sys_dict_type(dict_type);
+
+COMMENT ON TABLE sys_dict_type IS '字典类型';
+COMMENT ON COLUMN sys_dict_type.id IS 'id';
+COMMENT ON COLUMN sys_dict_type.dict_type IS '字典类型';
+COMMENT ON COLUMN sys_dict_type.dict_name IS '字典名称';
+COMMENT ON COLUMN sys_dict_type.remark IS '备注';
+COMMENT ON COLUMN sys_dict_type.sort IS '排序';
+COMMENT ON COLUMN sys_dict_type.creator IS '创建者';
+COMMENT ON COLUMN sys_dict_type.create_date IS '创建时间';
+COMMENT ON COLUMN sys_dict_type.updater IS '更新者';
+COMMENT ON COLUMN sys_dict_type.update_date IS '更新时间';
+
+create table sys_dict_data
+(
+ id NUMBER(20, 0) NOT NULL,
+ dict_type_id NUMBER(20, 0) NOT NULL,
+ dict_label varchar2(255),
+ dict_value varchar2(255),
+ remark varchar2(255),
+ sort NUMBER(10, 0),
+ creator NUMBER(20, 0),
+ create_date date,
+ updater NUMBER(20, 0),
+ update_date date,
+ primary key (id)
+);
+CREATE INDEX idx_sys_dict_data_sort on sys_dict_data(sort);
+CREATE UNIQUE INDEX uk_dict_type_value on sys_dict_data(dict_type_id, dict_value);
+
+COMMENT ON TABLE sys_dict_data IS '字典数据';
+COMMENT ON COLUMN sys_dict_data.id IS 'id';
+COMMENT ON COLUMN sys_dict_data.dict_type_id IS '字典类型ID';
+COMMENT ON COLUMN sys_dict_data.dict_label IS '字典标签';
+COMMENT ON COLUMN sys_dict_data.dict_value IS '字典值';
+COMMENT ON COLUMN sys_dict_data.remark IS '备注';
+COMMENT ON COLUMN sys_dict_data.sort IS '排序';
+COMMENT ON COLUMN sys_dict_data.creator IS '创建者';
+COMMENT ON COLUMN sys_dict_data.create_date IS '创建时间';
+COMMENT ON COLUMN sys_dict_data.updater IS '更新者';
+COMMENT ON COLUMN sys_dict_data.update_date IS '更新时间';
+
+create table sys_log_login
+(
+ id NUMBER(20, 0) NOT NULL,
+ operation NUMBER(2, 0),
+ status NUMBER(2, 0),
+ user_agent varchar2(500),
+ ip varchar2(32),
+ creator_name varchar2(50),
+ creator NUMBER(20, 0),
+ create_date date,
+ primary key (id)
+);
+CREATE INDEX idx_login_status on sys_log_login(status);
+CREATE INDEX idx_login_create_date on sys_log_login(create_date);
+
+COMMENT ON TABLE sys_log_login IS '登录日志';
+COMMENT ON COLUMN sys_log_login.id IS 'id';
+COMMENT ON COLUMN sys_log_login.operation IS '用户操作 0:用户登录 1:用户退出';
+COMMENT ON COLUMN sys_log_login.status IS '状态 0:失败 1:成功 2:账号已锁定';
+COMMENT ON COLUMN sys_log_login.user_agent IS '用户代理';
+COMMENT ON COLUMN sys_log_login.ip IS '操作IP';
+COMMENT ON COLUMN sys_log_login.creator_name IS '用户名';
+COMMENT ON COLUMN sys_log_login.creator IS '创建者';
+COMMENT ON COLUMN sys_log_login.create_date IS '创建时间';
+
+
+create table sys_log_operation
+(
+ id NUMBER(20, 0) NOT NULL,
+ operation varchar2(50),
+ request_uri varchar2(200),
+ request_method varchar2(20),
+ request_params clob,
+ request_time NUMBER(10, 0),
+ user_agent varchar2(500),
+ ip varchar2(32),
+ status NUMBER(2, 0),
+ creator_name varchar2(50),
+ creator NUMBER(20, 0),
+ create_date date,
+ primary key (id)
+);
+CREATE INDEX idx_operation_create_date on sys_log_operation(create_date);
+
+COMMENT ON TABLE sys_log_operation IS '操作日志';
+COMMENT ON COLUMN sys_log_operation.id IS 'id';
+COMMENT ON COLUMN sys_log_operation.operation IS '用户操作';
+COMMENT ON COLUMN sys_log_operation.request_uri IS '请求URI';
+COMMENT ON COLUMN sys_log_operation.request_method IS '请求方式';
+COMMENT ON COLUMN sys_log_operation.request_params IS '请求参数';
+COMMENT ON COLUMN sys_log_operation.request_time IS '请求时长(毫秒)';
+COMMENT ON COLUMN sys_log_operation.user_agent IS '用户代理';
+COMMENT ON COLUMN sys_log_operation.ip IS '操作IP';
+COMMENT ON COLUMN sys_log_operation.status IS '状态 0:失败 1:成功';
+COMMENT ON COLUMN sys_log_operation.creator_name IS '用户名';
+COMMENT ON COLUMN sys_log_operation.creator IS '创建者';
+COMMENT ON COLUMN sys_log_operation.create_date IS '创建时间';
+
+
+create table sys_log_error
+(
+ id NUMBER(20, 0) NOT NULL,
+ request_uri varchar2(200),
+ request_method varchar2(20),
+ request_params clob,
+ user_agent varchar2(500),
+ ip varchar2(32),
+ error_info clob,
+ creator NUMBER(20, 0),
+ create_date date,
+ primary key (id)
+);
+CREATE INDEX idx_error_create_date on sys_log_error(create_date);
+
+COMMENT ON TABLE sys_log_error IS '异常日志';
+COMMENT ON COLUMN sys_log_error.id IS 'id';
+COMMENT ON COLUMN sys_log_error.request_uri IS '请求URI';
+COMMENT ON COLUMN sys_log_error.request_method IS '请求方式';
+COMMENT ON COLUMN sys_log_error.request_params IS '请求参数';
+COMMENT ON COLUMN sys_log_error.user_agent IS '用户代理';
+COMMENT ON COLUMN sys_log_error.ip IS '操作IP';
+COMMENT ON COLUMN sys_log_error.error_info IS '异常信息';
+COMMENT ON COLUMN sys_log_error.creator IS '创建者';
+COMMENT ON COLUMN sys_log_error.create_date IS '创建时间';
+
+
+CREATE TABLE sys_oss (
+ id NUMBER(20, 0) NOT NULL,
+ url varchar2(200),
+ creator NUMBER(20, 0),
+ create_date date,
+ PRIMARY KEY (id)
+);
+CREATE INDEX idx_sys_oss_create_date on sys_oss(create_date);
+
+COMMENT ON TABLE sys_oss IS '文件上传';
+COMMENT ON COLUMN sys_oss.id IS 'id';
+COMMENT ON COLUMN sys_oss.url IS 'URL地址';
+COMMENT ON COLUMN sys_mail_log.creator IS '创建者';
+COMMENT ON COLUMN sys_mail_log.create_date IS '创建时间';
+
+
+CREATE TABLE schedule_job (
+ id NUMBER(20, 0) NOT NULL,
+ bean_name varchar2(200),
+ params varchar2(2000),
+ cron_expression varchar2(100),
+ status NUMBER(2, 0),
+ remark varchar2(255),
+ creator NUMBER(20, 0),
+ create_date date,
+ updater NUMBER(20, 0),
+ update_date date,
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX idx_schedule_job_create_date on schedule_job(create_date);
+
+COMMENT ON TABLE schedule_job IS '定时任务';
+COMMENT ON COLUMN schedule_job.id IS 'id';
+COMMENT ON COLUMN schedule_job.bean_name IS 'spring bean名称';
+COMMENT ON COLUMN schedule_job.params IS '参数';
+COMMENT ON COLUMN schedule_job.cron_expression IS 'cron表达式';
+COMMENT ON COLUMN schedule_job.status IS '任务状态 0:暂停 1:正常';
+COMMENT ON COLUMN schedule_job.remark IS '备注';
+COMMENT ON COLUMN schedule_job.creator IS '创建者';
+COMMENT ON COLUMN schedule_job.create_date IS '创建时间';
+COMMENT ON COLUMN schedule_job.updater IS '更新者';
+COMMENT ON COLUMN schedule_job.update_date IS '更新时间';
+
+
+CREATE TABLE schedule_job_log (
+ id NUMBER(20, 0) NOT NULL,
+ job_id NUMBER(20, 0) NOT NULL,
+ bean_name varchar2(200),
+ params varchar2(2000),
+ status NUMBER(2, 0),
+ error varchar2(2000),
+ times NUMBER(10, 0),
+ create_date date,
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX idx_job_log_job_id on schedule_job_log(job_id);
+CREATE INDEX idx_job_log_create_date on schedule_job_log(create_date);
+
+COMMENT ON TABLE schedule_job_log IS '定时任务日志';
+COMMENT ON COLUMN schedule_job_log.id IS 'id';
+COMMENT ON COLUMN schedule_job_log.bean_name IS 'spring bean名称';
+COMMENT ON COLUMN schedule_job_log.params IS '参数';
+COMMENT ON COLUMN schedule_job_log.status IS '任务状态 0:失败 1:成功';
+COMMENT ON COLUMN schedule_job_log.error IS '失败信息';
+COMMENT ON COLUMN schedule_job_log.times IS '耗时(单位:毫秒)';
+COMMENT ON COLUMN schedule_job.create_date IS '创建时间';
+
+
+CREATE TABLE sys_user_token (
+ id NUMBER(20, 0) NOT NULL,
+ user_id NUMBER(20, 0),
+ token varchar2(100),
+ expire_date date,
+ update_date date,
+ create_date date,
+ PRIMARY KEY (id)
+);
+
+CREATE UNIQUE INDEX uk_sys_user_token_user_id on sys_user_token(user_id);
+CREATE UNIQUE INDEX uk_sys_user_token on sys_user_token(token);
+
+COMMENT ON TABLE sys_user_token IS '系统用户Token';
+COMMENT ON COLUMN sys_user_token.id IS 'id';
+COMMENT ON COLUMN sys_user_token.user_id IS '用户id';
+COMMENT ON COLUMN sys_user_token.token IS '用户token';
+COMMENT ON COLUMN sys_user_token.expire_date IS '过期时间';
+COMMENT ON COLUMN sys_user_token.update_date IS '更新时间';
+COMMENT ON COLUMN sys_user_token.create_date IS '创建时间';
+
+
+
+-- 初始数据
+INSERT INTO sys_user(id, username, password, real_name, gender, email, mobile, status, dept_id, super_admin, creator, create_date, updater, update_date) VALUES (1067246875800000001, 'admin', '$2a$10$012Kx2ba5jzqr9gLlG4MX.bnQJTD9UWqF57XDo2N3.fPtLne02u/m', '管理员', 0, 'root@renren.io', '13612345678', 1, null, 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000002, 0, '权限管理', NULL, NULL, 0, 'icon-safetycertificate', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000003, 1067246875800000055, '新增', NULL, 'sys:user:save,sys:dept:list,sys:role:list', 1, NULL, 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000004, 1067246875800000055, '修改', NULL, 'sys:user:update,sys:dept:list,sys:role:list', 1, NULL, 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000005, 1067246875800000055, '删除', NULL, 'sys:user:delete', 1, NULL, 3, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000006, 1067246875800000055, '导出', NULL, 'sys:user:export', 1, NULL, 4, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000007, 1067246875800000002, '角色管理', 'sys/role', NULL, 0, 'icon-team', 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000008, 1067246875800000007, '查看', NULL, 'sys:role:page,sys:role:info', 1, NULL, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000009, 1067246875800000007, '新增', NULL, 'sys:role:save,sys:menu:select,sys:dept:list', 1, NULL, 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000010, 1067246875800000007, '修改', NULL, 'sys:role:update,sys:menu:select,sys:dept:list', 1, NULL, 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000011, 1067246875800000007, '删除', NULL, 'sys:role:delete', 1, NULL, 3, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000012, 1067246875800000002, '部门管理', 'sys/dept', NULL, 0, 'icon-apartment', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000014, 1067246875800000012, '查看', NULL, 'sys:dept:list,sys:dept:info', 1, NULL, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000015, 1067246875800000012, '新增', NULL, 'sys:dept:save', 1, NULL, 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000016, 1067246875800000012, '修改', NULL, 'sys:dept:update', 1, NULL, 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000017, 1067246875800000012, '删除', NULL, 'sys:dept:delete', 1, NULL, 3, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000025, 1067246875800000035, '菜单管理', 'sys/menu', NULL, 0, 'icon-unorderedlist', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000026, 1067246875800000025, '查看', NULL, 'sys:menu:list,sys:menu:info', 1, NULL, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000027, 1067246875800000025, '新增', NULL, 'sys:menu:save', 1, NULL, 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000028, 1067246875800000025, '修改', NULL, 'sys:menu:update', 1, NULL, 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000029, 1067246875800000025, '删除', NULL, 'sys:menu:delete', 1, NULL, 3, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000030, 1067246875800000035, '定时任务', 'job/schedule', NULL, 0, 'icon-dashboard', 3, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000031, 1067246875800000030, '查看', NULL, 'sys:schedule:page,sys:schedule:info', 1, NULL, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000032, 1067246875800000030, '新增', NULL, 'sys:schedule:save', 1, NULL, 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000033, 1067246875800000030, '修改', NULL, 'sys:schedule:update', 1, NULL, 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000034, 1067246875800000030, '删除', NULL, 'sys:schedule:delete', 1, NULL, 3, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000035, 0, '系统设置', NULL, NULL, 0, 'icon-setting', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000036, 1067246875800000030, '暂停', NULL, 'sys:schedule:pause', 1, NULL, 4, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000037, 1067246875800000030, '恢复', NULL, 'sys:schedule:resume', 1, NULL, 5, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000038, 1067246875800000030, '立即执行', NULL, 'sys:schedule:run', 1, NULL, 6, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000039, 1067246875800000030, '日志列表', NULL, 'sys:schedule:log', 1, NULL, 7, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000040, 1067246875800000035, '参数管理', 'sys/params', '', 0, 'icon-fileprotect', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000041, 1067246875800000035, '字典管理', 'sys/dict-type', NULL, 0, 'icon-golden-fill', 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000042, 1067246875800000041, '查看', NULL, 'sys:dict:page,sys:dict:info', 1, NULL, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000043, 1067246875800000041, '新增', NULL, 'sys:dict:save', 1, NULL, 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000044, 1067246875800000041, '修改', NULL, 'sys:dict:update', 1, NULL, 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000045, 1067246875800000041, '删除', NULL, 'sys:dict:delete', 1, NULL, 3, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000046, 0, '日志管理', NULL, NULL, 0, 'icon-container', 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000047, 1067246875800000035, '文件上传', 'oss/oss', 'sys:oss:all', 0, 'icon-upload', 4, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000048, 1067246875800000046, '登录日志', 'sys/log-login', 'sys:log:login', 0, 'icon-filedone', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000049, 1067246875800000046, '操作日志', 'sys/log-operation', 'sys:log:operation', 0, 'icon-solution', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000050, 1067246875800000046, '异常日志', 'sys/log-error', 'sys:log:error', 0, 'icon-file-exception', 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000051, 1067246875800000053, 'SQL监控', '{{ApiUrl}}/druid/sql.html', NULL, 0, 'icon-database', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000053, 0, '系统监控', NULL, NULL, 0, 'icon-desktop', 3, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000055, 1067246875800000002, '用户管理', 'sys/user', NULL, 0, 'icon-user', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000056, 1067246875800000055, '查看', NULL, 'sys:user:page,sys:user:info', 1, NULL, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000057, 1067246875800000040, '新增', NULL, 'sys:params:save', 1, NULL, 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000058, 1067246875800000040, '导出', NULL, 'sys:params:export', 1, NULL, 4, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000059, 1067246875800000040, '查看', '', 'sys:params:page,sys:params:info', 1, NULL, 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000060, 1067246875800000040, '修改', NULL, 'sys:params:update', 1, NULL, 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000061, 1067246875800000040, '删除', '', 'sys:params:delete', 1, '', 3, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1156748733921165314, 1067246875800000053, '接口文档', '{{ApiUrl}}/doc.html', '', 0, 'icon-file-word', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000062, 1067246875800000063, '1067246875800000066,1067246875800000063', '技术部', 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000063, 1067246875800000066, '1067246875800000066', '长沙分公司', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000064, 1067246875800000066, '1067246875800000066', '上海分公司', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000065, 1067246875800000064, '1067246875800000066,1067246875800000064', '市场部', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000066, 0, '0', '人人开源集团', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000067, 1067246875800000064, '1067246875800000066,1067246875800000064', '销售部', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000068, 1067246875800000063, '1067246875800000066,1067246875800000063', '产品部', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1160061077912858625, 'gender', '性别', '', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061112075464705, 1160061077912858625, '男', '0', '', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061146967879681, 1160061077912858625, '女', '1', '', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061190127267841, 1160061077912858625, '保密', '2', '', 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1225813644059140097, 'notice_type', '站内通知-类型', '', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814069634195457, 1225813644059140097, '公告', '0', '', 0, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814107559092225, 1225813644059140097, '会议', '1', '', 1, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814271879340034, 1225813644059140097, '其他', '2', '', 2, 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+INSERT INTO sys_params(id, param_code, param_value, param_type, remark, creator, create_date, updater, update_date) VALUES (1067246875800000073, 'CLOUD_STORAGE_CONFIG_KEY', '{"type":1,"qiniuDomain":"http://test.oss.renren.io","qiniuPrefix":"upload","qiniuAccessKey":"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ","qiniuSecretKey":"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV","qiniuBucketName":"renren-oss","aliyunDomain":"","aliyunPrefix":"","aliyunEndPoint":"","aliyunAccessKeyId":"","aliyunAccessKeySecret":"","aliyunBucketName":"","qcloudDomain":"","qcloudPrefix":"","qcloudSecretId":"","qcloudSecretKey":"","qcloudBucketName":""}', '0', '云存储配置信息', 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+INSERT INTO schedule_job (id, bean_name, params, cron_expression, status, remark, creator, create_date, updater, update_date) VALUES (1067246875800000076, 'testTask', 'renren', '0 0/30 * * * ?', 0, '有参测试,多个参数使用json', 1067246875800000001, CURRENT_DATE, 1067246875800000001, CURRENT_DATE);
+
+
+-- quartz自带表结构
+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(13) NULL,
+ PREV_FIRE_TIME NUMBER(13) NULL,
+ PRIORITY NUMBER(13) NULL,
+ TRIGGER_STATE VARCHAR2(16) NOT NULL,
+ TRIGGER_TYPE VARCHAR2(8) NOT NULL,
+ START_TIME NUMBER(13) NOT NULL,
+ END_TIME NUMBER(13) 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(13) NULL,
+ LONG_PROP_2 NUMBER(13) 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,
+ 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(95) NOT NULL,
+ TRIGGER_NAME VARCHAR2(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR2(200) NOT NULL,
+ INSTANCE_NAME VARCHAR2(200) NOT NULL,
+ FIRED_TIME NUMBER(13) NOT NULL,
+ SCHED_TIME NUMBER(13) 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(13) 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);
+
+
diff --git a/bdty-admin/db/postgresql.sql b/bdty-admin/db/postgresql.sql
new file mode 100644
index 0000000..b4f928d
--- /dev/null
+++ b/bdty-admin/db/postgresql.sql
@@ -0,0 +1,699 @@
+CREATE TABLE sys_user (
+ id int8 NOT NULL,
+ username varchar(50) NOT NULL,
+ password varchar(100),
+ real_name varchar(50),
+ head_url varchar(200),
+ gender int,
+ email varchar(100),
+ mobile varchar(100),
+ dept_id int8,
+ super_admin int,
+ status int,
+ creator int8,
+ create_date timestamp,
+ updater int8,
+ update_date timestamp,
+ primary key (id)
+);
+
+CREATE UNIQUE INDEX uk_sys_user_username on sys_user(username);
+CREATE INDEX idx_sys_user_create_date on sys_user(create_date);
+
+COMMENT ON TABLE sys_user IS '用户管理';
+COMMENT ON COLUMN sys_user.id IS 'id';
+COMMENT ON COLUMN sys_user.username IS '用户名';
+COMMENT ON COLUMN sys_user.password IS '密码';
+COMMENT ON COLUMN sys_user.real_name IS '姓名';
+COMMENT ON COLUMN sys_user.head_url IS '头像';
+COMMENT ON COLUMN sys_user.gender IS '性别 0:男 1:女 2:保密';
+COMMENT ON COLUMN sys_user.email IS '邮箱';
+COMMENT ON COLUMN sys_user.mobile IS '手机号';
+COMMENT ON COLUMN sys_user.dept_id IS '部门ID';
+COMMENT ON COLUMN sys_user.super_admin IS '超级管理员 0:否 1:是';
+COMMENT ON COLUMN sys_user.status IS '状态 0:停用 1:正常';
+COMMENT ON COLUMN sys_user.creator IS '创建者';
+COMMENT ON COLUMN sys_user.create_date IS '创建时间';
+COMMENT ON COLUMN sys_user.updater IS '更新者';
+COMMENT ON COLUMN sys_user.update_date IS '更新时间';
+
+
+CREATE TABLE sys_dept (
+ id int8 NOT NULL,
+ pid int8,
+ pids varchar(500),
+ name varchar(50),
+ sort int,
+ creator int8,
+ create_date timestamp,
+ updater int8,
+ update_date timestamp,
+ primary key (id)
+);
+CREATE INDEX idx_sys_dept_pid on sys_dept(pid);
+CREATE INDEX idx_sys_dept_idx_sort on sys_dept(sort);
+
+COMMENT ON TABLE sys_dept IS '部门管理';
+COMMENT ON COLUMN sys_dept.id IS 'id';
+COMMENT ON COLUMN sys_dept.pid IS '上级ID';
+COMMENT ON COLUMN sys_dept.pids IS '所有上级ID,用逗号分开';
+COMMENT ON COLUMN sys_dept.name IS '部门名称';
+COMMENT ON COLUMN sys_dept.sort IS '排序';
+COMMENT ON COLUMN sys_dept.creator IS '创建者';
+COMMENT ON COLUMN sys_dept.create_date IS '创建时间';
+COMMENT ON COLUMN sys_dept.updater IS '更新者';
+COMMENT ON COLUMN sys_dept.update_date IS '更新时间';
+
+
+create table sys_role
+(
+ id int8 NOT NULL,
+ name varchar(50),
+ remark varchar(100),
+ dept_id int8,
+ creator int8,
+ create_date timestamp,
+ updater int8,
+ update_date timestamp,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_dept_id on sys_role(dept_id);
+
+COMMENT ON TABLE sys_role IS '角色管理';
+COMMENT ON COLUMN sys_role.id IS 'id';
+COMMENT ON COLUMN sys_role.name IS '角色名称';
+COMMENT ON COLUMN sys_role.remark IS '备注';
+COMMENT ON COLUMN sys_role.dept_id IS '部门ID';
+COMMENT ON COLUMN sys_role.creator IS '创建者';
+COMMENT ON COLUMN sys_role.create_date IS '创建时间';
+COMMENT ON COLUMN sys_role.updater IS '更新者';
+COMMENT ON COLUMN sys_role.update_date IS '更新时间';
+
+
+create table sys_menu
+(
+ id int8 NOT NULL,
+ pid int8,
+ name varchar(200),
+ url varchar(200),
+ permissions varchar(500),
+ menu_type int,
+ icon varchar(50),
+ sort int,
+ creator int8,
+ create_date timestamp,
+ updater int8,
+ update_date timestamp,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_menu_pid on sys_menu(pid);
+CREATE INDEX idx_sys_menu_sort on sys_menu(sort);
+
+COMMENT ON TABLE sys_menu IS '菜单管理';
+COMMENT ON COLUMN sys_menu.id IS 'id';
+COMMENT ON COLUMN sys_menu.pid IS '上级ID,一级菜单为0';
+COMMENT ON COLUMN sys_menu.name IS '名称';
+COMMENT ON COLUMN sys_menu.url IS '菜单URL';
+COMMENT ON COLUMN sys_menu.permissions IS '授权(多个用逗号分隔,如:sys:user:list,sys:user:save)';
+COMMENT ON COLUMN sys_menu.menu_type IS '类型 0:菜单 1:按钮';
+COMMENT ON COLUMN sys_menu.icon IS '菜单图标';
+COMMENT ON COLUMN sys_menu.sort IS '排序';
+COMMENT ON COLUMN sys_menu.creator IS '创建者';
+COMMENT ON COLUMN sys_menu.create_date IS '创建时间';
+COMMENT ON COLUMN sys_menu.updater IS '更新者';
+COMMENT ON COLUMN sys_menu.update_date IS '更新时间';
+
+
+create table sys_role_user
+(
+ id int8 NOT NULL,
+ role_id int8,
+ user_id int8,
+ creator int8,
+ create_date timestamp,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_user_role_id on sys_role_user(role_id);
+CREATE INDEX idx_sys_role_user_user_id on sys_role_user(user_id);
+
+COMMENT ON TABLE sys_role_user IS '角色用户关系';
+COMMENT ON COLUMN sys_role_user.role_id IS '角色ID';
+COMMENT ON COLUMN sys_role_user.user_id IS '用户ID';
+COMMENT ON COLUMN sys_role_user.creator IS '创建者';
+COMMENT ON COLUMN sys_role_user.create_date IS '创建时间';
+
+
+create table sys_role_menu
+(
+ id int8 NOT NULL,
+ role_id int8,
+ menu_id int8,
+ creator int8,
+ create_date timestamp,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_menu_role_id on sys_role_menu(role_id);
+CREATE INDEX idx_sys_role_menu_menu_id on sys_role_menu(menu_id);
+
+COMMENT ON TABLE sys_role_menu IS '角色菜单关系';
+COMMENT ON COLUMN sys_role_menu.role_id IS '角色ID';
+COMMENT ON COLUMN sys_role_menu.menu_id IS '菜单ID';
+COMMENT ON COLUMN sys_role_menu.creator IS '创建者';
+COMMENT ON COLUMN sys_role_menu.create_date IS '创建时间';
+
+
+create table sys_role_data_scope
+(
+ id int8 NOT NULL,
+ role_id int8,
+ dept_id int8,
+ creator int8,
+ create_date timestamp,
+ primary key (id)
+);
+CREATE INDEX idx_data_scope_role_id on sys_role_data_scope(role_id);
+
+COMMENT ON TABLE sys_role_data_scope IS '角色数据权限';
+COMMENT ON COLUMN sys_role_data_scope.role_id IS '角色ID';
+COMMENT ON COLUMN sys_role_data_scope.dept_id IS '部门ID';
+COMMENT ON COLUMN sys_role_data_scope.creator IS '创建者';
+COMMENT ON COLUMN sys_role_data_scope.create_date IS '创建时间';
+
+
+create table sys_params
+(
+ id int8 NOT NULL,
+ param_code varchar(32),
+ param_value varchar(2000),
+ param_type int DEFAULT 1 NOT NULL,
+ remark varchar(200),
+ creator int8,
+ create_date timestamp,
+ updater int8,
+ update_date timestamp,
+ primary key (id)
+);
+CREATE UNIQUE INDEX uk_sys_params_param_code on sys_params(param_code);
+CREATE INDEX idx_sys_params_create_date on sys_params(create_date);
+
+COMMENT ON TABLE sys_params IS '参数管理';
+COMMENT ON COLUMN sys_params.param_code IS '参数编码';
+COMMENT ON COLUMN sys_params.param_value IS '参数值';
+COMMENT ON COLUMN sys_params.param_type IS '类型 0:系统参数 1:非系统参数';
+COMMENT ON COLUMN sys_params.remark IS '备注';
+COMMENT ON COLUMN sys_params.creator IS '创建者';
+COMMENT ON COLUMN sys_params.create_date IS '创建时间';
+COMMENT ON COLUMN sys_params.updater IS '更新者';
+COMMENT ON COLUMN sys_params.update_date IS '更新时间';
+
+
+create table sys_dict_type
+(
+ id int8 NOT NULL,
+ dict_type varchar(100),
+ dict_name varchar(255),
+ remark varchar(255),
+ sort int,
+ creator int8,
+ create_date timestamp,
+ updater int8,
+ update_date timestamp,
+ primary key (id)
+);
+CREATE UNIQUE INDEX uk_sys_dict_type_dict_type on sys_dict_type(dict_type);
+
+COMMENT ON TABLE sys_dict_type IS '字典类型';
+COMMENT ON COLUMN sys_dict_type.id IS 'id';
+COMMENT ON COLUMN sys_dict_type.dict_type IS '字典类型';
+COMMENT ON COLUMN sys_dict_type.dict_name IS '字典名称';
+COMMENT ON COLUMN sys_dict_type.remark IS '备注';
+COMMENT ON COLUMN sys_dict_type.sort IS '排序';
+COMMENT ON COLUMN sys_dict_type.creator IS '创建者';
+COMMENT ON COLUMN sys_dict_type.create_date IS '创建时间';
+COMMENT ON COLUMN sys_dict_type.updater IS '更新者';
+COMMENT ON COLUMN sys_dict_type.update_date IS '更新时间';
+
+create table sys_dict_data
+(
+ id int8 NOT NULL,
+ dict_type_id int8 NOT NULL,
+ dict_label varchar(255),
+ dict_value varchar(255),
+ remark varchar(255),
+ sort int,
+ creator int8,
+ create_date timestamp,
+ updater int8,
+ update_date timestamp,
+ primary key (id)
+);
+CREATE INDEX idx_sys_dict_data_sort on sys_dict_data(sort);
+CREATE UNIQUE INDEX uk_dict_type_value on sys_dict_data(dict_type_id, dict_value);
+
+COMMENT ON TABLE sys_dict_data IS '字典数据';
+COMMENT ON COLUMN sys_dict_data.id IS 'id';
+COMMENT ON COLUMN sys_dict_data.dict_type_id IS '字典类型ID';
+COMMENT ON COLUMN sys_dict_data.dict_label IS '字典标签';
+COMMENT ON COLUMN sys_dict_data.dict_value IS '字典值';
+COMMENT ON COLUMN sys_dict_data.remark IS '备注';
+COMMENT ON COLUMN sys_dict_data.sort IS '排序';
+COMMENT ON COLUMN sys_dict_data.creator IS '创建者';
+COMMENT ON COLUMN sys_dict_data.create_date IS '创建时间';
+COMMENT ON COLUMN sys_dict_data.updater IS '更新者';
+COMMENT ON COLUMN sys_dict_data.update_date IS '更新时间';
+
+
+create table sys_log_login
+(
+ id int8 NOT NULL,
+ operation int,
+ status int,
+ user_agent varchar(500),
+ ip varchar(32),
+ creator_name varchar(50),
+ creator int8,
+ create_date timestamp,
+ primary key (id)
+);
+CREATE INDEX idx_login_status on sys_log_login(status);
+CREATE INDEX idx_login_create_date on sys_log_login(create_date);
+
+COMMENT ON TABLE sys_log_login IS '登录日志';
+COMMENT ON COLUMN sys_log_login.id IS 'id';
+COMMENT ON COLUMN sys_log_login.operation IS '用户操作 0:用户登录 1:用户退出';
+COMMENT ON COLUMN sys_log_login.status IS '状态 0:失败 1:成功 2:账号已锁定';
+COMMENT ON COLUMN sys_log_login.user_agent IS '用户代理';
+COMMENT ON COLUMN sys_log_login.ip IS '操作IP';
+COMMENT ON COLUMN sys_log_login.creator_name IS '用户名';
+COMMENT ON COLUMN sys_log_login.creator IS '创建者';
+COMMENT ON COLUMN sys_log_login.create_date IS '创建时间';
+
+
+create table sys_log_operation
+(
+ id int8 NOT NULL,
+ operation varchar(50),
+ request_uri varchar(200),
+ request_method varchar(20),
+ request_params text,
+ request_time int,
+ user_agent varchar(500),
+ ip varchar(32),
+ status int,
+ creator_name varchar(50),
+ creator int8,
+ create_date timestamp,
+ primary key (id)
+);
+CREATE INDEX idx_operation_create_date on sys_log_operation(create_date);
+
+COMMENT ON TABLE sys_log_operation IS '操作日志';
+COMMENT ON COLUMN sys_log_operation.id IS 'id';
+COMMENT ON COLUMN sys_log_operation.operation IS '用户操作';
+COMMENT ON COLUMN sys_log_operation.request_uri IS '请求URI';
+COMMENT ON COLUMN sys_log_operation.request_method IS '请求方式';
+COMMENT ON COLUMN sys_log_operation.request_params IS '请求参数';
+COMMENT ON COLUMN sys_log_operation.request_time IS '请求时长(毫秒)';
+COMMENT ON COLUMN sys_log_operation.user_agent IS '用户代理';
+COMMENT ON COLUMN sys_log_operation.ip IS '操作IP';
+COMMENT ON COLUMN sys_log_operation.status IS '状态 0:失败 1:成功';
+COMMENT ON COLUMN sys_log_operation.creator_name IS '用户名';
+COMMENT ON COLUMN sys_log_operation.creator IS '创建者';
+COMMENT ON COLUMN sys_log_operation.create_date IS '创建时间';
+
+
+create table sys_log_error
+(
+ id int8 NOT NULL,
+ request_uri varchar(200),
+ request_method varchar(20),
+ request_params text,
+ user_agent varchar(500),
+ ip varchar(32),
+ error_info text,
+ creator int8,
+ create_date timestamp,
+ primary key (id)
+);
+CREATE INDEX idx_error_create_date on sys_log_error(create_date);
+
+COMMENT ON TABLE sys_log_error IS '异常日志';
+COMMENT ON COLUMN sys_log_error.id IS 'id';
+COMMENT ON COLUMN sys_log_error.request_uri IS '请求URI';
+COMMENT ON COLUMN sys_log_error.request_method IS '请求方式';
+COMMENT ON COLUMN sys_log_error.request_params IS '请求参数';
+COMMENT ON COLUMN sys_log_error.user_agent IS '用户代理';
+COMMENT ON COLUMN sys_log_error.ip IS '操作IP';
+COMMENT ON COLUMN sys_log_error.error_info IS '异常信息';
+COMMENT ON COLUMN sys_log_error.creator IS '创建者';
+COMMENT ON COLUMN sys_log_error.create_date IS '创建时间';
+
+
+
+CREATE TABLE sys_oss (
+ id int8 NOT NULL,
+ url varchar(200),
+ creator int8,
+ create_date timestamp,
+ PRIMARY KEY (id)
+);
+CREATE INDEX idx_sys_oss_create_date on sys_oss(create_date);
+
+COMMENT ON TABLE sys_oss IS '文件上传';
+COMMENT ON COLUMN sys_oss.id IS 'id';
+COMMENT ON COLUMN sys_oss.url IS 'URL地址';
+COMMENT ON COLUMN sys_oss.creator IS '创建者';
+COMMENT ON COLUMN sys_oss.create_date IS '创建时间';
+
+
+CREATE TABLE schedule_job (
+ id int8 NOT NULL,
+ bean_name varchar(200),
+ params varchar(2000),
+ cron_expression varchar(100),
+ status int,
+ remark varchar(255),
+ creator int8,
+ create_date timestamp,
+ updater int8,
+ update_date timestamp,
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX idx_schedule_job_create_date on schedule_job(create_date);
+
+COMMENT ON TABLE schedule_job IS '定时任务';
+COMMENT ON COLUMN schedule_job.id IS 'id';
+COMMENT ON COLUMN schedule_job.bean_name IS 'spring bean名称';
+COMMENT ON COLUMN schedule_job.params IS '参数';
+COMMENT ON COLUMN schedule_job.cron_expression IS 'cron表达式';
+COMMENT ON COLUMN schedule_job.status IS '任务状态 0:暂停 1:正常';
+COMMENT ON COLUMN schedule_job.remark IS '备注';
+COMMENT ON COLUMN schedule_job.creator IS '创建者';
+COMMENT ON COLUMN schedule_job.create_date IS '创建时间';
+COMMENT ON COLUMN schedule_job.updater IS '更新者';
+COMMENT ON COLUMN schedule_job.update_date IS '更新时间';
+
+
+CREATE TABLE schedule_job_log (
+ id int8 NOT NULL,
+ job_id int8 NOT NULL,
+ bean_name varchar(200),
+ params varchar(2000),
+ status int,
+ error varchar(2000),
+ times int,
+ create_date timestamp,
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX idx_job_log_job_id on schedule_job_log(job_id);
+CREATE INDEX idx_job_log_create_date on schedule_job_log(create_date);
+
+COMMENT ON TABLE schedule_job_log IS '定时任务日志';
+COMMENT ON COLUMN schedule_job_log.id IS 'id';
+COMMENT ON COLUMN schedule_job_log.bean_name IS 'spring bean名称';
+COMMENT ON COLUMN schedule_job_log.params IS '参数';
+COMMENT ON COLUMN schedule_job_log.status IS '任务状态 0:失败 1:成功';
+COMMENT ON COLUMN schedule_job_log.error IS '失败信息';
+COMMENT ON COLUMN schedule_job_log.times IS '耗时(单位:毫秒)';
+COMMENT ON COLUMN schedule_job.create_date IS '创建时间';
+
+
+CREATE TABLE sys_user_token (
+ id int8 NOT NULL,
+ user_id int8,
+ token varchar(100),
+ expire_date timestamp,
+ update_date timestamp,
+ create_date timestamp,
+ PRIMARY KEY (id)
+);
+
+CREATE UNIQUE INDEX uk_sys_user_token_user_id on sys_user_token(user_id);
+CREATE UNIQUE INDEX uk_sys_user_token on sys_user_token(token);
+
+COMMENT ON TABLE sys_user_token IS '系统用户Token';
+COMMENT ON COLUMN sys_user_token.id IS 'id';
+COMMENT ON COLUMN sys_user_token.user_id IS '用户id';
+COMMENT ON COLUMN sys_user_token.token IS '用户token';
+COMMENT ON COLUMN sys_user_token.expire_date IS '过期时间';
+COMMENT ON COLUMN sys_user_token.update_date IS '更新时间';
+COMMENT ON COLUMN sys_user_token.create_date IS '创建时间';
+
+
+
+-- 初始数据
+INSERT INTO sys_user(id, username, password, real_name, gender, email, mobile, status, dept_id, super_admin, creator, create_date, updater, update_date) VALUES (1067246875800000001, 'admin', '$2a$10$012Kx2ba5jzqr9gLlG4MX.bnQJTD9UWqF57XDo2N3.fPtLne02u/m', '管理员', 0, 'root@renren.io', '13612345678', 1, null, 1, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000002, 0, '权限管理', NULL, NULL, 0, 'icon-safetycertificate', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000003, 1067246875800000055, '新增', NULL, 'sys:user:save,sys:dept:list,sys:role:list', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000004, 1067246875800000055, '修改', NULL, 'sys:user:update,sys:dept:list,sys:role:list', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000005, 1067246875800000055, '删除', NULL, 'sys:user:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000006, 1067246875800000055, '导出', NULL, 'sys:user:export', 1, NULL, 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000007, 1067246875800000002, '角色管理', 'sys/role', NULL, 0, 'icon-team', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000008, 1067246875800000007, '查看', NULL, 'sys:role:page,sys:role:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000009, 1067246875800000007, '新增', NULL, 'sys:role:save,sys:menu:select,sys:dept:list', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000010, 1067246875800000007, '修改', NULL, 'sys:role:update,sys:menu:select,sys:dept:list', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000011, 1067246875800000007, '删除', NULL, 'sys:role:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000012, 1067246875800000002, '部门管理', 'sys/dept', NULL, 0, 'icon-apartment', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000014, 1067246875800000012, '查看', NULL, 'sys:dept:list,sys:dept:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000015, 1067246875800000012, '新增', NULL, 'sys:dept:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000016, 1067246875800000012, '修改', NULL, 'sys:dept:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000017, 1067246875800000012, '删除', NULL, 'sys:dept:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000025, 1067246875800000035, '菜单管理', 'sys/menu', NULL, 0, 'icon-unorderedlist', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000026, 1067246875800000025, '查看', NULL, 'sys:menu:list,sys:menu:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000027, 1067246875800000025, '新增', NULL, 'sys:menu:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000028, 1067246875800000025, '修改', NULL, 'sys:menu:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000029, 1067246875800000025, '删除', NULL, 'sys:menu:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000030, 1067246875800000035, '定时任务', 'job/schedule', NULL, 0, 'icon-dashboard', 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000031, 1067246875800000030, '查看', NULL, 'sys:schedule:page,sys:schedule:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000032, 1067246875800000030, '新增', NULL, 'sys:schedule:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000033, 1067246875800000030, '修改', NULL, 'sys:schedule:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000034, 1067246875800000030, '删除', NULL, 'sys:schedule:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000035, 0, '系统设置', NULL, NULL, 0, 'icon-setting', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000036, 1067246875800000030, '暂停', NULL, 'sys:schedule:pause', 1, NULL, 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000037, 1067246875800000030, '恢复', NULL, 'sys:schedule:resume', 1, NULL, 5, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000038, 1067246875800000030, '立即执行', NULL, 'sys:schedule:run', 1, NULL, 6, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000039, 1067246875800000030, '日志列表', NULL, 'sys:schedule:log', 1, NULL, 7, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000040, 1067246875800000035, '参数管理', 'sys/params', '', 0, 'icon-fileprotect', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000041, 1067246875800000035, '字典管理', 'sys/dict-type', NULL, 0, 'icon-golden-fill', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000042, 1067246875800000041, '查看', NULL, 'sys:dict:page,sys:dict:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000043, 1067246875800000041, '新增', NULL, 'sys:dict:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000044, 1067246875800000041, '修改', NULL, 'sys:dict:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000045, 1067246875800000041, '删除', NULL, 'sys:dict:delete', 1, NULL, 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000046, 0, '日志管理', NULL, NULL, 0, 'icon-container', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000047, 1067246875800000035, '文件上传', 'oss/oss', 'sys:oss:all', 0, 'icon-upload', 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000048, 1067246875800000046, '登录日志', 'sys/log-login', 'sys:log:login', 0, 'icon-filedone', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000049, 1067246875800000046, '操作日志', 'sys/log-operation', 'sys:log:operation', 0, 'icon-solution', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000050, 1067246875800000046, '异常日志', 'sys/log-error', 'sys:log:error', 0, 'icon-file-exception', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000051, 1067246875800000053, 'SQL监控', '{{ApiUrl}}/druid/sql.html', NULL, 0, 'icon-database', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000053, 0, '系统监控', NULL, NULL, 0, 'icon-desktop', 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000055, 1067246875800000002, '用户管理', 'sys/user', NULL, 0, 'icon-user', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000056, 1067246875800000055, '查看', NULL, 'sys:user:page,sys:user:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000057, 1067246875800000040, '新增', NULL, 'sys:params:save', 1, NULL, 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000058, 1067246875800000040, '导出', NULL, 'sys:params:export', 1, NULL, 4, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000059, 1067246875800000040, '查看', '', 'sys:params:page,sys:params:info', 1, NULL, 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000060, 1067246875800000040, '修改', NULL, 'sys:params:update', 1, NULL, 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000061, 1067246875800000040, '删除', '', 'sys:params:delete', 1, '', 3, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1156748733921165314, 1067246875800000053, '接口文档', '{{ApiUrl}}/doc.html', '', 0, 'icon-file-word', 1, 1067246875800000001, now(), 1067246875800000001, now());
+
+
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000062, 1067246875800000063, '1067246875800000066,1067246875800000063', '技术部', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000063, 1067246875800000066, '1067246875800000066', '长沙分公司', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000064, 1067246875800000066, '1067246875800000066', '上海分公司', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000065, 1067246875800000064, '1067246875800000066,1067246875800000064', '市场部', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000066, 0, '0', '人人开源集团', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000067, 1067246875800000064, '1067246875800000066,1067246875800000064', '销售部', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000068, 1067246875800000063, '1067246875800000066,1067246875800000063', '产品部', 1, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1160061077912858625, 'gender', '性别', '', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061112075464705, 1160061077912858625, '男', '0', '', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061146967879681, 1160061077912858625, '女', '1', '', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061190127267841, 1160061077912858625, '保密', '2', '', 2, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1225813644059140097, 'notice_type', '站内通知-类型', '', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814069634195457, 1225813644059140097, '公告', '0', '', 0, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814107559092225, 1225813644059140097, '会议', '1', '', 1, 1067246875800000001, now(), 1067246875800000001, now());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814271879340034, 1225813644059140097, '其他', '2', '', 2, 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO sys_params(id, param_code, param_value, param_type, remark, creator, create_date, updater, update_date) VALUES (1067246875800000073, 'CLOUD_STORAGE_CONFIG_KEY', '{"type":1,"qiniuDomain":"http://test.oss.renren.io","qiniuPrefix":"upload","qiniuAccessKey":"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ","qiniuSecretKey":"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV","qiniuBucketName":"renren-oss","aliyunDomain":"","aliyunPrefix":"","aliyunEndPoint":"","aliyunAccessKeyId":"","aliyunAccessKeySecret":"","aliyunBucketName":"","qcloudDomain":"","qcloudPrefix":"","qcloudSecretId":"","qcloudSecretKey":"","qcloudBucketName":""}', '0', '云存储配置信息', 1067246875800000001, now(), 1067246875800000001, now());
+
+INSERT INTO schedule_job (id, bean_name, params, cron_expression, status, remark, creator, create_date, updater, update_date) VALUES (1067246875800000076, 'testTask', 'renren', '0 0/30 * * * ?', 0, '有参测试,多个参数使用json', 1067246875800000001, now(), 1067246875800000001, now());
+
+
+
+-- quartz自带表结构
+CREATE TABLE qrtz_job_details
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ JOB_NAME VARCHAR(200) NOT NULL,
+ JOB_GROUP VARCHAR(200) NOT NULL,
+ DESCRIPTION VARCHAR(250) NULL,
+ JOB_CLASS_NAME VARCHAR(250) 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 VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ JOB_NAME VARCHAR(200) NOT NULL,
+ JOB_GROUP VARCHAR(200) NOT NULL,
+ DESCRIPTION VARCHAR(250) NULL,
+ NEXT_FIRE_TIME BIGINT NULL,
+ PREV_FIRE_TIME BIGINT NULL,
+ PRIORITY INTEGER NULL,
+ TRIGGER_STATE VARCHAR(16) NOT NULL,
+ TRIGGER_TYPE VARCHAR(8) NOT NULL,
+ START_TIME BIGINT NOT NULL,
+ END_TIME BIGINT NULL,
+ CALENDAR_NAME VARCHAR(200) 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 VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) 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)
+);
+
+CREATE TABLE qrtz_cron_triggers
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ CRON_EXPRESSION VARCHAR(120) NOT NULL,
+ TIME_ZONE_ID VARCHAR(80),
+ 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)
+);
+
+CREATE TABLE qrtz_simprop_triggers
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ STR_PROP_1 VARCHAR(512) NULL,
+ STR_PROP_2 VARCHAR(512) NULL,
+ STR_PROP_3 VARCHAR(512) NULL,
+ INT_PROP_1 INT NULL,
+ INT_PROP_2 INT NULL,
+ LONG_PROP_1 BIGINT NULL,
+ LONG_PROP_2 BIGINT NULL,
+ DEC_PROP_1 NUMERIC(13,4) NULL,
+ DEC_PROP_2 NUMERIC(13,4) NULL,
+ BOOL_PROP_1 BOOL NULL,
+ BOOL_PROP_2 BOOL 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)
+);
+
+CREATE TABLE qrtz_blob_triggers
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) 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)
+);
+
+CREATE TABLE qrtz_calendars
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ CALENDAR_NAME VARCHAR(200) NOT NULL,
+ CALENDAR BYTEA NOT NULL,
+ PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
+);
+
+
+CREATE TABLE qrtz_paused_trigger_grps
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
+);
+
+CREATE TABLE qrtz_fired_triggers
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ ENTRY_ID VARCHAR(95) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ INSTANCE_NAME VARCHAR(200) NOT NULL,
+ FIRED_TIME BIGINT NOT NULL,
+ SCHED_TIME BIGINT NOT NULL,
+ PRIORITY INTEGER NOT NULL,
+ STATE VARCHAR(16) NOT NULL,
+ JOB_NAME VARCHAR(200) NULL,
+ JOB_GROUP VARCHAR(200) NULL,
+ IS_NONCONCURRENT BOOL NULL,
+ REQUESTS_RECOVERY BOOL NULL,
+ PRIMARY KEY (SCHED_NAME,ENTRY_ID)
+);
+
+CREATE TABLE qrtz_scheduler_state
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ INSTANCE_NAME VARCHAR(200) 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 VARCHAR(120) NOT NULL,
+ LOCK_NAME VARCHAR(40) NOT NULL,
+ 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);
+
+
+commit;
diff --git a/bdty-admin/db/sqlserver.sql b/bdty-admin/db/sqlserver.sql
new file mode 100644
index 0000000..0d40be7
--- /dev/null
+++ b/bdty-admin/db/sqlserver.sql
@@ -0,0 +1,674 @@
+CREATE TABLE sys_user (
+ id bigint NOT NULL,
+ username varchar(50) NOT NULL,
+ password varchar(100),
+ real_name varchar(50),
+ head_url varchar(200),
+ gender int,
+ email varchar(100),
+ mobile varchar(100),
+ dept_id bigint,
+ super_admin int,
+ status int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+
+CREATE UNIQUE INDEX uk_sys_user_username on sys_user(username);
+CREATE INDEX idx_sys_user_create_date on sys_user(create_date);
+
+
+CREATE TABLE sys_dept (
+ id bigint NOT NULL,
+ pid bigint,
+ pids varchar(500),
+ name varchar(50),
+ sort int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_sys_dept_pid on sys_dept(pid);
+CREATE INDEX idx_sys_dept_idx_sort on sys_dept(sort);
+
+
+create table sys_role
+(
+ id bigint NOT NULL,
+ name varchar(50),
+ remark varchar(100),
+ dept_id bigint,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_dept_id on sys_role(dept_id);
+
+
+create table sys_menu
+(
+ id bigint NOT NULL,
+ pid bigint,
+ name varchar(200),
+ url varchar(200),
+ permissions varchar(500),
+ menu_type int,
+ icon varchar(50),
+ sort int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_menu_pid on sys_menu(pid);
+CREATE INDEX idx_sys_menu_sort on sys_menu(sort);
+
+
+create table sys_role_user
+(
+ id bigint NOT NULL,
+ role_id bigint,
+ user_id bigint,
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_user_role_id on sys_role_user(role_id);
+CREATE INDEX idx_sys_role_user_user_id on sys_role_user(user_id);
+
+
+create table sys_role_menu
+(
+ id bigint NOT NULL,
+ role_id bigint,
+ menu_id bigint,
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+
+CREATE INDEX idx_sys_role_menu_role_id on sys_role_menu(role_id);
+CREATE INDEX idx_sys_role_menu_menu_id on sys_role_menu(menu_id);
+
+
+create table sys_role_data_scope
+(
+ id bigint NOT NULL,
+ role_id bigint,
+ dept_id bigint,
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_data_scope_role_id on sys_role_data_scope(role_id);
+
+
+create table sys_params
+(
+ id bigint NOT NULL,
+ param_code varchar(32),
+ param_value varchar(2000),
+ param_type int DEFAULT 1 NOT NULL,
+ remark varchar(200),
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+CREATE UNIQUE INDEX uk_sys_params_param_code on sys_params(param_code);
+CREATE INDEX idx_sys_params_create_date on sys_params(create_date);
+
+
+create table sys_dict_type
+(
+ id bigint NOT NULL,
+ dict_type varchar(100),
+ dict_name varchar(255),
+ remark varchar(255),
+ sort int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+CREATE UNIQUE INDEX uk_sys_dict_type_dict_type on sys_dict_type(dict_type);
+
+
+create table sys_dict_data
+(
+ id bigint NOT NULL,
+ dict_type_id bigint NOT NULL,
+ dict_label varchar(255),
+ dict_value varchar(255),
+ remark varchar(255),
+ sort int,
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_sys_dict_data_sort on sys_dict_data(sort);
+CREATE UNIQUE INDEX uk_dict_type_value on sys_dict_data(dict_type_id, dict_value);
+
+
+create table sys_log_login
+(
+ id bigint NOT NULL,
+ operation int,
+ status int,
+ user_agent varchar(500),
+ ip varchar(32),
+ creator_name varchar(50),
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_login_status on sys_log_login(status);
+CREATE INDEX idx_login_create_date on sys_log_login(create_date);
+
+
+create table sys_log_operation
+(
+ id bigint NOT NULL,
+ operation varchar(50),
+ request_uri varchar(200),
+ request_method varchar(20),
+ request_params text,
+ request_time int,
+ user_agent varchar(500),
+ ip varchar(32),
+ status int,
+ creator_name varchar(50),
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_operation_create_date on sys_log_operation(create_date);
+
+
+create table sys_log_error
+(
+ id bigint NOT NULL,
+ request_uri varchar(200),
+ request_method varchar(20),
+ request_params text,
+ user_agent varchar(500),
+ ip varchar(32),
+ error_info text,
+ creator bigint,
+ create_date datetime,
+ primary key (id)
+);
+CREATE INDEX idx_error_create_date on sys_log_error(create_date);
+
+
+CREATE TABLE sys_oss (
+ id bigint NOT NULL,
+ url varchar(200),
+ creator bigint,
+ create_date datetime,
+ PRIMARY KEY (id)
+);
+CREATE INDEX idx_sys_oss_create_date on sys_oss(create_date);
+
+
+CREATE TABLE schedule_job (
+ id bigint NOT NULL,
+ bean_name varchar(200),
+ params varchar(2000),
+ cron_expression varchar(100),
+ status int,
+ remark varchar(255),
+ creator bigint,
+ create_date datetime,
+ updater bigint,
+ update_date datetime,
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX idx_schedule_job_create_date on schedule_job(create_date);
+
+
+CREATE TABLE schedule_job_log (
+ id bigint NOT NULL,
+ job_id bigint NOT NULL,
+ bean_name varchar(200),
+ params varchar(2000),
+ status int,
+ error varchar(2000),
+ times int,
+ create_date datetime,
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX idx_job_log_job_id on schedule_job_log(job_id);
+CREATE INDEX idx_job_log_create_date on schedule_job_log(create_date);
+
+
+CREATE TABLE sys_user_token (
+ id bigint NOT NULL,
+ user_id bigint,
+ token varchar(100),
+ expire_date datetime,
+ update_date datetime,
+ create_date datetime,
+ PRIMARY KEY (id)
+);
+
+CREATE UNIQUE INDEX uk_sys_user_token_user_id on sys_user_token(user_id);
+CREATE UNIQUE INDEX uk_sys_user_token on sys_user_token(token);
+
+
+
+-- 初始数据
+INSERT INTO sys_user(id, username, password, real_name, gender, email, mobile, status, dept_id, super_admin, creator, create_date, updater, update_date) VALUES (1067246875800000001, 'admin', '$2a$10$012Kx2ba5jzqr9gLlG4MX.bnQJTD9UWqF57XDo2N3.fPtLne02u/m', '管理员', 0, 'root@renren.io', '13612345678', 1, null, 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000002, 0, '权限管理', NULL, NULL, 0, 'icon-safetycertificate', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000003, 1067246875800000055, '新增', NULL, 'sys:user:save,sys:dept:list,sys:role:list', 1, NULL, 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000004, 1067246875800000055, '修改', NULL, 'sys:user:update,sys:dept:list,sys:role:list', 1, NULL, 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000005, 1067246875800000055, '删除', NULL, 'sys:user:delete', 1, NULL, 3, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000006, 1067246875800000055, '导出', NULL, 'sys:user:export', 1, NULL, 4, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000007, 1067246875800000002, '角色管理', 'sys/role', NULL, 0, 'icon-team', 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000008, 1067246875800000007, '查看', NULL, 'sys:role:page,sys:role:info', 1, NULL, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000009, 1067246875800000007, '新增', NULL, 'sys:role:save,sys:menu:select,sys:dept:list', 1, NULL, 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000010, 1067246875800000007, '修改', NULL, 'sys:role:update,sys:menu:select,sys:dept:list', 1, NULL, 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000011, 1067246875800000007, '删除', NULL, 'sys:role:delete', 1, NULL, 3, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000012, 1067246875800000002, '部门管理', 'sys/dept', NULL, 0, 'icon-apartment', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000014, 1067246875800000012, '查看', NULL, 'sys:dept:list,sys:dept:info', 1, NULL, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000015, 1067246875800000012, '新增', NULL, 'sys:dept:save', 1, NULL, 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000016, 1067246875800000012, '修改', NULL, 'sys:dept:update', 1, NULL, 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000017, 1067246875800000012, '删除', NULL, 'sys:dept:delete', 1, NULL, 3, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000025, 1067246875800000035, '菜单管理', 'sys/menu', NULL, 0, 'icon-unorderedlist', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000026, 1067246875800000025, '查看', NULL, 'sys:menu:list,sys:menu:info', 1, NULL, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000027, 1067246875800000025, '新增', NULL, 'sys:menu:save', 1, NULL, 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000028, 1067246875800000025, '修改', NULL, 'sys:menu:update', 1, NULL, 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000029, 1067246875800000025, '删除', NULL, 'sys:menu:delete', 1, NULL, 3, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000030, 1067246875800000035, '定时任务', 'job/schedule', NULL, 0, 'icon-dashboard', 3, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000031, 1067246875800000030, '查看', NULL, 'sys:schedule:page,sys:schedule:info', 1, NULL, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000032, 1067246875800000030, '新增', NULL, 'sys:schedule:save', 1, NULL, 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000033, 1067246875800000030, '修改', NULL, 'sys:schedule:update', 1, NULL, 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000034, 1067246875800000030, '删除', NULL, 'sys:schedule:delete', 1, NULL, 3, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000035, 0, '系统设置', NULL, NULL, 0, 'icon-setting', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000036, 1067246875800000030, '暂停', NULL, 'sys:schedule:pause', 1, NULL, 4, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000037, 1067246875800000030, '恢复', NULL, 'sys:schedule:resume', 1, NULL, 5, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000038, 1067246875800000030, '立即执行', NULL, 'sys:schedule:run', 1, NULL, 6, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000039, 1067246875800000030, '日志列表', NULL, 'sys:schedule:log', 1, NULL, 7, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000040, 1067246875800000035, '参数管理', 'sys/params', '', 0, 'icon-fileprotect', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000041, 1067246875800000035, '字典管理', 'sys/dict-type', NULL, 0, 'icon-golden-fill', 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000042, 1067246875800000041, '查看', NULL, 'sys:dict:page,sys:dict:info', 1, NULL, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000043, 1067246875800000041, '新增', NULL, 'sys:dict:save', 1, NULL, 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000044, 1067246875800000041, '修改', NULL, 'sys:dict:update', 1, NULL, 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000045, 1067246875800000041, '删除', NULL, 'sys:dict:delete', 1, NULL, 3, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000046, 0, '日志管理', NULL, NULL, 0, 'icon-container', 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000047, 1067246875800000035, '文件上传', 'oss/oss', 'sys:oss:all', 0, 'icon-upload', 4, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000048, 1067246875800000046, '登录日志', 'sys/log-login', 'sys:log:login', 0, 'icon-filedone', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000049, 1067246875800000046, '操作日志', 'sys/log-operation', 'sys:log:operation', 0, 'icon-solution', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000050, 1067246875800000046, '异常日志', 'sys/log-error', 'sys:log:error', 0, 'icon-file-exception', 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000051, 1067246875800000053, 'SQL监控', '{{ApiUrl}}/druid/sql.html', NULL, 0, 'icon-database', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000053, 0, '系统监控', NULL, NULL, 0, 'icon-desktop', 3, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000055, 1067246875800000002, '用户管理', 'sys/user', NULL, 0, 'icon-user', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000056, 1067246875800000055, '查看', NULL, 'sys:user:page,sys:user:info', 1, NULL, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000057, 1067246875800000040, '新增', NULL, 'sys:params:save', 1, NULL, 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000058, 1067246875800000040, '导出', NULL, 'sys:params:export', 1, NULL, 4, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000059, 1067246875800000040, '查看', '', 'sys:params:page,sys:params:info', 1, NULL, 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000060, 1067246875800000040, '修改', NULL, 'sys:params:update', 1, NULL, 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1067246875800000061, 1067246875800000040, '删除', '', 'sys:params:delete', 1, '', 3, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_menu (id, pid, name, url, permissions, menu_type, icon, sort, creator, create_date, updater, update_date) VALUES (1156748733921165314, 1067246875800000053, '接口文档', '{{ApiUrl}}/doc.html', '', 0, 'icon-file-word', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+
+
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000062, 1067246875800000063, '1067246875800000066,1067246875800000063', '技术部', 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000063, 1067246875800000066, '1067246875800000066', '长沙分公司', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000064, 1067246875800000066, '1067246875800000066', '上海分公司', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000065, 1067246875800000064, '1067246875800000066,1067246875800000064', '市场部', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000066, 0, '0', '人人开源集团', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000067, 1067246875800000064, '1067246875800000066,1067246875800000064', '销售部', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dept(id, pid, pids, name, sort, creator, create_date, updater, update_date) VALUES (1067246875800000068, 1067246875800000063, '1067246875800000066,1067246875800000063', '产品部', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1160061077912858625, 'gender', '性别', '', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061112075464705, 1160061077912858625, '男', '0', '', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061146967879681, 1160061077912858625, '女', '1', '', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1160061190127267841, 1160061077912858625, '保密', '2', '', 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dict_type(id, dict_type, dict_name, remark, sort, creator, create_date, updater, update_date) VALUES (1225813644059140097, 'notice_type', '站内通知-类型', '', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814069634195457, 1225813644059140097, '公告', '0', '', 0, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814107559092225, 1225813644059140097, '会议', '1', '', 1, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+INSERT INTO sys_dict_data(id, dict_type_id, dict_label, dict_value, remark, sort, creator, create_date, updater, update_date) VALUES (1225814271879340034, 1225813644059140097, '其他', '2', '', 2, 1067246875800000001, getdate(), 1067246875800000001, getdate());
+
+INSERT INTO sys_params(id, param_code, param_value, param_type, remark, creator, create_date, updater, update_date) VALUES (1067246875800000073, 'CLOUD_STORAGE_CONFIG_KEY', '{"type":1,"qiniuDomain":"http://test.oss.renren.io","qiniuPrefix":"upload","qiniuAccessKey":"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ","qiniuSecretKey":"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV","qiniuBucketName":"renren-oss","aliyunDomain":"","aliyunPrefix":"","aliyunEndPoint":"","aliyunAccessKeyId":"","aliyunAccessKeySecret":"","aliyunBucketName":"","qcloudDomain":"","qcloudPrefix":"","qcloudSecretId":"","qcloudSecretKey":"","qcloudBucketName":""}', '0', '云存储配置信息', 1067246875800000001, getdate(), 1067246875800000001, getdate());
+
+INSERT INTO schedule_job (id, bean_name, params, cron_expression, status, remark, creator, create_date, updater, update_date) VALUES (1067246875800000076, 'testTask', 'renren', '0 0/30 * * * ?', 0, '有参测试,多个参数使用json', 1067246875800000001, getdate(), 1067246875800000001, getdate());
+
+
+-- quartz自带表结构
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
+ ALTER TABLE [dbo].[QRTZ_TRIGGERS] DROP CONSTRAINT FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
+ ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] DROP CONSTRAINT FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
+ ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
+ ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_CALENDARS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_CALENDARS]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_CRON_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_CRON_TRIGGERS]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_BLOB_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_BLOB_TRIGGERS]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_FIRED_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_FIRED_TRIGGERS]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_PAUSED_TRIGGER_GRPS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SCHEDULER_STATE]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_SCHEDULER_STATE]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_LOCKS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_LOCKS]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_JOB_DETAILS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_JOB_DETAILS]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SIMPLE_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SIMPROP_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS]
+GO
+
+IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
+ DROP TABLE [dbo].[QRTZ_TRIGGERS]
+GO
+
+CREATE TABLE [dbo].[QRTZ_CALENDARS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [CALENDAR_NAME] [VARCHAR] (200) NOT NULL ,
+ [CALENDAR] [IMAGE] NOT NULL
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_CRON_TRIGGERS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [TRIGGER_NAME] [VARCHAR] (200) NOT NULL ,
+ [TRIGGER_GROUP] [VARCHAR] (200) NOT NULL ,
+ [CRON_EXPRESSION] [VARCHAR] (120) NOT NULL ,
+ [TIME_ZONE_ID] [VARCHAR] (80)
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_FIRED_TRIGGERS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [ENTRY_ID] [VARCHAR] (95) NOT NULL ,
+ [TRIGGER_NAME] [VARCHAR] (200) NOT NULL ,
+ [TRIGGER_GROUP] [VARCHAR] (200) NOT NULL ,
+ [INSTANCE_NAME] [VARCHAR] (200) NOT NULL ,
+ [FIRED_TIME] [BIGINT] NOT NULL ,
+ [SCHED_TIME] [BIGINT] NOT NULL ,
+ [PRIORITY] [INTEGER] NOT NULL ,
+ [STATE] [VARCHAR] (16) NOT NULL,
+ [JOB_NAME] [VARCHAR] (200) NULL ,
+ [JOB_GROUP] [VARCHAR] (200) NULL ,
+ [IS_NONCONCURRENT] [VARCHAR] (1) NULL ,
+ [REQUESTS_RECOVERY] [VARCHAR] (1) NULL
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [TRIGGER_GROUP] [VARCHAR] (200) NOT NULL
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_SCHEDULER_STATE] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [INSTANCE_NAME] [VARCHAR] (200) NOT NULL ,
+ [LAST_CHECKIN_TIME] [BIGINT] NOT NULL ,
+ [CHECKIN_INTERVAL] [BIGINT] NOT NULL
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_LOCKS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [LOCK_NAME] [VARCHAR] (40) NOT NULL
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_JOB_DETAILS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [JOB_NAME] [VARCHAR] (200) NOT NULL ,
+ [JOB_GROUP] [VARCHAR] (200) NOT NULL ,
+ [DESCRIPTION] [VARCHAR] (250) 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] [IMAGE] NULL
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [TRIGGER_NAME] [VARCHAR] (200) NOT NULL ,
+ [TRIGGER_GROUP] [VARCHAR] (200) NOT NULL ,
+ [REPEAT_COUNT] [BIGINT] NOT NULL ,
+ [REPEAT_INTERVAL] [BIGINT] NOT NULL ,
+ [TIMES_TRIGGERED] [BIGINT] NOT NULL
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [TRIGGER_NAME] [VARCHAR] (200) NOT NULL ,
+ [TRIGGER_GROUP] [VARCHAR] (200) NOT NULL ,
+ [STR_PROP_1] [VARCHAR] (512) NULL,
+ [STR_PROP_2] [VARCHAR] (512) NULL,
+ [STR_PROP_3] [VARCHAR] (512) NULL,
+ [INT_PROP_1] [INT] NULL,
+ [INT_PROP_2] [INT] NULL,
+ [LONG_PROP_1] [BIGINT] NULL,
+ [LONG_PROP_2] [BIGINT] NULL,
+ [DEC_PROP_1] [NUMERIC] (13,4) NULL,
+ [DEC_PROP_2] [NUMERIC] (13,4) NULL,
+ [BOOL_PROP_1] [VARCHAR] (1) NULL,
+ [BOOL_PROP_2] [VARCHAR] (1) NULL,
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_BLOB_TRIGGERS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [TRIGGER_NAME] [VARCHAR] (200) NOT NULL ,
+ [TRIGGER_GROUP] [VARCHAR] (200) NOT NULL ,
+ [BLOB_DATA] [IMAGE] NULL
+) ON [PRIMARY]
+GO
+
+CREATE TABLE [dbo].[QRTZ_TRIGGERS] (
+ [SCHED_NAME] [VARCHAR] (120) NOT NULL ,
+ [TRIGGER_NAME] [VARCHAR] (200) NOT NULL ,
+ [TRIGGER_GROUP] [VARCHAR] (200) NOT NULL ,
+ [JOB_NAME] [VARCHAR] (200) NOT NULL ,
+ [JOB_GROUP] [VARCHAR] (200) NOT NULL ,
+ [DESCRIPTION] [VARCHAR] (250) NULL ,
+ [NEXT_FIRE_TIME] [BIGINT] NULL ,
+ [PREV_FIRE_TIME] [BIGINT] NULL ,
+ [PRIORITY] [INTEGER] NULL ,
+ [TRIGGER_STATE] [VARCHAR] (16) NOT NULL ,
+ [TRIGGER_TYPE] [VARCHAR] (8) NOT NULL ,
+ [START_TIME] [BIGINT] NOT NULL ,
+ [END_TIME] [BIGINT] NULL ,
+ [CALENDAR_NAME] [VARCHAR] (200) NULL ,
+ [MISFIRE_INSTR] [SMALLINT] NULL ,
+ [JOB_DATA] [IMAGE] NULL
+) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_CALENDARS] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_CALENDARS] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [CALENDAR_NAME]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_CRON_TRIGGERS] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_FIRED_TRIGGERS] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [ENTRY_ID]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_PAUSED_TRIGGER_GRPS] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [TRIGGER_GROUP]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_SCHEDULER_STATE] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [INSTANCE_NAME]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_LOCKS] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_LOCKS] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [LOCK_NAME]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_JOB_DETAILS] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [JOB_NAME],
+ [JOB_GROUP]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_SIMPLE_TRIGGERS] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_SIMPROP_TRIGGERS] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_TRIGGERS] WITH NOCHECK ADD
+ CONSTRAINT [PK_QRTZ_TRIGGERS] PRIMARY KEY CLUSTERED
+ (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD
+ CONSTRAINT [FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY
+ (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) REFERENCES [dbo].[QRTZ_TRIGGERS] (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) ON DELETE CASCADE
+GO
+
+ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD
+ CONSTRAINT [FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY
+ (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) REFERENCES [dbo].[QRTZ_TRIGGERS] (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) ON DELETE CASCADE
+GO
+
+ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD
+ CONSTRAINT [FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY
+ (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) REFERENCES [dbo].[QRTZ_TRIGGERS] (
+ [SCHED_NAME],
+ [TRIGGER_NAME],
+ [TRIGGER_GROUP]
+ ) ON DELETE CASCADE
+GO
+
+ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD
+ CONSTRAINT [FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS] FOREIGN KEY
+ (
+ [SCHED_NAME],
+ [JOB_NAME],
+ [JOB_GROUP]
+ ) REFERENCES [dbo].[QRTZ_JOB_DETAILS] (
+ [SCHED_NAME],
+ [JOB_NAME],
+ [JOB_GROUP]
+ )
+GO
\ No newline at end of file
diff --git a/bdty-admin/pom.xml b/bdty-admin/pom.xml
new file mode 100644
index 0000000..e02e087
--- /dev/null
+++ b/bdty-admin/pom.xml
@@ -0,0 +1,113 @@
+
+
+ io.bdty
+ bdty-security
+ 5.3.0
+
+ 4.0.0
+ bdty-admin
+ jar
+ bdty-admin
+
+
+ 2.3.2
+ 1.12.0
+ 1.6.2
+ 3.2.1
+ 7.2.27
+ 2.8.3
+ 3.2.2
+ 5.4.4
+
+
+
+
+ io.bdty
+ bdty-common
+ 5.3.0
+
+
+ io.bdty
+ bdty-dynamic-datasource
+ 5.3.0
+
+
+ org.quartz-scheduler
+ quartz
+ ${quartz.version}
+
+
+ com.mchange
+ c3p0
+
+
+ com.zaxxer
+ HikariCP-java6
+
+
+
+
+ org.apache.shiro
+ shiro-core
+ ${shiro.version}
+
+
+ org.apache.shiro
+ shiro-spring
+ ${shiro.version}
+
+
+ com.github.whvcse
+ easy-captcha
+ ${captcha.version}
+
+
+ com.alibaba
+ easyexcel
+ ${easyexcel.version}
+
+
+ com.qiniu
+ qiniu-java-sdk
+ ${qiniu.version}
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ ${aliyun.oss.version}
+
+
+ com.aliyun
+ aliyun-java-sdk-core
+ ${aliyun.core.version}
+
+
+ com.qcloud
+ cos_api
+ ${qcloud.cos.version}
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/AdminApplication.java b/bdty-admin/src/main/java/io/bdty/AdminApplication.java
new file mode 100644
index 0000000..370e337
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/AdminApplication.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+
+/**
+ * bdty-admin
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@SpringBootApplication
+public class AdminApplication extends SpringBootServletInitializer {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AdminApplication.class, args);
+ }
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+ return application.sources(AdminApplication.class);
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/annotation/DataFilter.java b/bdty-admin/src/main/java/io/bdty/common/annotation/DataFilter.java
new file mode 100644
index 0000000..675c491
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/annotation/DataFilter.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 数据过滤注解
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DataFilter {
+ /**
+ * 表的别名
+ */
+ String tableAlias() default "";
+
+ /**
+ * 用户ID
+ */
+ String userId() default "creator";
+
+ /**
+ * 部门ID
+ */
+ String deptId() default "dept_id";
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/annotation/LogOperation.java b/bdty-admin/src/main/java/io/bdty/common/annotation/LogOperation.java
new file mode 100644
index 0000000..ed4d084
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/annotation/LogOperation.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 操作日志注解
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface LogOperation {
+
+ String value() default "";
+}
diff --git a/bdty-admin/src/main/java/io/bdty/common/aspect/DataFilterAspect.java b/bdty-admin/src/main/java/io/bdty/common/aspect/DataFilterAspect.java
new file mode 100644
index 0000000..80e77c2
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/aspect/DataFilterAspect.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.aspect;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.qiniu.util.StringUtils;
+
+import io.bdty.common.annotation.DataFilter;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.exception.ErrorCode;
+import io.bdty.common.exception.RenException;
+import io.bdty.common.interceptor.DataScope;
+import io.bdty.modules.security.user.SecurityUser;
+import io.bdty.modules.security.user.UserDetail;
+import io.bdty.modules.sys.enums.SuperAdminEnum;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 数据过滤,切面处理类
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Aspect
+@Component
+public class DataFilterAspect {
+
+ @Pointcut("@annotation(io.bdty.common.annotation.DataFilter)")
+ public void dataFilterCut() {
+
+ }
+
+ @Before("dataFilterCut()")
+ public void dataFilter(JoinPoint point) {
+ Object params = point.getArgs()[0];
+ if (params != null && params instanceof Map) {
+ UserDetail user = SecurityUser.getUser();
+
+ //如果是超级管理员,则不进行数据过滤
+ if (user.getSuperAdmin() == SuperAdminEnum.YES.value()) {
+ return;
+ }
+
+ try {
+ //否则进行数据过滤
+ Map map = (Map) params;
+ String sqlFilter = getSqlFilter(user, point);
+ map.put(Constant.SQL_FILTER, new DataScope(sqlFilter));
+ } catch (Exception e) {
+
+ }
+
+ return;
+ }
+
+ throw new RenException(ErrorCode.DATA_SCOPE_PARAMS_ERROR);
+ }
+
+ /**
+ * 获取数据过滤的SQL
+ */
+ private String getSqlFilter(UserDetail user, JoinPoint point) throws Exception {
+ MethodSignature signature = (MethodSignature) point.getSignature();
+ Method method = point.getTarget().getClass().getDeclaredMethod(signature.getName(), signature.getParameterTypes());
+ DataFilter dataFilter = method.getAnnotation(DataFilter.class);
+
+ //获取表的别名
+ String tableAlias = dataFilter.tableAlias();
+ if (StrUtil.isNotBlank(tableAlias)) {
+ tableAlias += ".";
+ }
+
+ StringBuilder sqlFilter = new StringBuilder();
+ sqlFilter.append(" (");
+
+ //部门ID列表
+ List deptIdList = user.getDeptIdList();
+ if (CollUtil.isNotEmpty(deptIdList)) {
+ sqlFilter.append(tableAlias).append(dataFilter.deptId());
+
+ sqlFilter.append(" in(").append(StringUtils.join(deptIdList, ",")).append(")");
+ }
+
+ //查询本人数据
+ if (CollUtil.isNotEmpty(deptIdList)) {
+ sqlFilter.append(" or ");
+ }
+ sqlFilter.append(tableAlias).append(dataFilter.userId()).append("=").append(user.getId());
+
+ sqlFilter.append(")");
+
+ return sqlFilter.toString();
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/aspect/LogOperationAspect.java b/bdty-admin/src/main/java/io/bdty/common/aspect/LogOperationAspect.java
new file mode 100644
index 0000000..f1c0830
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/aspect/LogOperationAspect.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.aspect;
+
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.utils.HttpContextUtils;
+import io.bdty.common.utils.IpUtils;
+import io.bdty.common.utils.JsonUtils;
+import io.bdty.modules.log.entity.SysLogOperationEntity;
+import io.bdty.modules.log.enums.OperationStatusEnum;
+import io.bdty.modules.log.service.SysLogOperationService;
+import io.bdty.modules.security.user.SecurityUser;
+import io.bdty.modules.security.user.UserDetail;
+import lombok.AllArgsConstructor;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+
+/**
+ * 操作日志,切面处理类
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Aspect
+@Component
+@AllArgsConstructor
+public class LogOperationAspect {
+ private final SysLogOperationService sysLogOperationService;
+
+ @Pointcut("@annotation(io.bdty.common.annotation.LogOperation)")
+ public void logPointCut() {
+
+ }
+
+ @Around("logPointCut()")
+ public Object around(ProceedingJoinPoint point) throws Throwable {
+ long beginTime = System.currentTimeMillis();
+ try {
+ //执行方法
+ Object result = point.proceed();
+
+ //执行时长(毫秒)
+ long time = System.currentTimeMillis() - beginTime;
+ //保存日志
+ saveLog(point, time, OperationStatusEnum.SUCCESS.value());
+
+ return result;
+ } catch (Exception e) {
+ //执行时长(毫秒)
+ long time = System.currentTimeMillis() - beginTime;
+ //保存日志
+ saveLog(point, time, OperationStatusEnum.FAIL.value());
+
+ throw e;
+ }
+ }
+
+ private void saveLog(ProceedingJoinPoint joinPoint, long time, Integer status) throws Exception {
+ MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+ Method method = joinPoint.getTarget().getClass().getDeclaredMethod(signature.getName(), signature.getParameterTypes());
+ LogOperation annotation = method.getAnnotation(LogOperation.class);
+
+ SysLogOperationEntity log = new SysLogOperationEntity();
+ if (annotation != null) {
+ //注解上的描述
+ log.setOperation(annotation.value());
+ }
+
+ //登录用户信息
+ UserDetail user = SecurityUser.getUser();
+ if (user != null) {
+ log.setCreatorName(user.getUsername());
+ }
+
+ log.setStatus(status);
+ log.setRequestTime((int) time);
+
+ //请求相关信息
+ HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
+ log.setIp(IpUtils.getIpAddr(request));
+ log.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));
+ log.setRequestUri(request.getRequestURI());
+ log.setRequestMethod(request.getMethod());
+
+ //请求参数
+ Object[] args = joinPoint.getArgs();
+ try {
+ String params = JsonUtils.toJsonString(args[0]);
+ log.setRequestParams(params);
+ } catch (Exception e) {
+
+ }
+
+ //保存到DB
+ sysLogOperationService.save(log);
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/config/CorsConfig.java b/bdty-admin/src/main/java/io/bdty/common/config/CorsConfig.java
new file mode 100644
index 0000000..581fcf0
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/config/CorsConfig.java
@@ -0,0 +1,31 @@
+package io.bdty.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+@Configuration
+public class CorsConfig {
+
+ // 当前跨域请求最大有效时长。这里默认1天
+ private static final long MAX_AGE = 24 * 60 * 60;
+
+ private CorsConfiguration buildConfig() {
+ CorsConfiguration corsConfiguration = new CorsConfiguration();
+ corsConfiguration.setAllowCredentials(true); //允许接受cookie
+ corsConfiguration.addAllowedOriginPattern("*"); // 1 设置访问源地址
+ corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
+ corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
+ corsConfiguration.setMaxAge(MAX_AGE);
+ return corsConfiguration;
+ }
+
+ @Bean
+ public CorsFilter corsFilter() {
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ source.registerCorsConfiguration("/**", buildConfig()); // 4 对接口配置跨域设置
+ return new CorsFilter(source);
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/config/MybatisPlusConfig.java b/bdty-admin/src/main/java/io/bdty/common/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..0da6a43
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/config/MybatisPlusConfig.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.config;
+
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+
+import io.bdty.common.interceptor.DataFilterInterceptor;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * mybatis-plus配置
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
+ // 数据权限
+ mybatisPlusInterceptor.addInnerInterceptor(new DataFilterInterceptor());
+ // 分页插件
+ mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+ // 乐观锁
+ mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
+ // 防止全表更新与删除
+ mybatisPlusInterceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
+
+ return mybatisPlusInterceptor;
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/config/SwaggerConfig.java b/bdty-admin/src/main/java/io/bdty/common/config/SwaggerConfig.java
new file mode 100644
index 0000000..4fc4fe9
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/config/SwaggerConfig.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.config;
+
+import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
+
+import io.bdty.common.constant.Constant;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Swagger配置
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Configuration
+@EnableSwagger2WebMvc
+@AllArgsConstructor
+public class SwaggerConfig {
+ private final OpenApiExtensionResolver openApiExtensionResolver;
+
+ @Bean
+ public Docket createRestApi() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(apiInfo())
+ .select()
+ //加了ApiOperation注解的类,生成接口文档
+ .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+ //包下的类,生成接口文档
+ //.apis(RequestHandlerSelectors.basePackage("io.bdty.modules.job.controller"))
+ .paths(PathSelectors.any())
+ .build()
+ .extensions(openApiExtensionResolver.buildExtensions("Renren"))
+ .directModelSubstitute(java.util.Date.class, String.class)
+ .securitySchemes(security());
+ }
+
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder()
+ .title("人人开源")
+ .description("renren-admin文档")
+ .termsOfServiceUrl("https://www.renren.io")
+ .version("5.x")
+ .build();
+ }
+
+ private List security() {
+ ApiKey key = new ApiKey(Constant.TOKEN_HEADER, Constant.TOKEN_HEADER, "header");
+
+ List list = new ArrayList<>();
+ list.add(key);
+ return list;
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/config/UploadFilePathConfig.java b/bdty-admin/src/main/java/io/bdty/common/config/UploadFilePathConfig.java
new file mode 100644
index 0000000..e40cc67
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/config/UploadFilePathConfig.java
@@ -0,0 +1,21 @@
+package io.bdty.common.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+@SuppressWarnings("deprecation")
+@Configuration
+public class UploadFilePathConfig extends WebMvcConfigurerAdapter {
+
+ @Value("${file.staticAccessPath}")
+ private String staticAccessPath;
+ @Value("${file.uploadFolder}")
+ private String uploadFolder;
+
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ registry.addResourceHandler(staticAccessPath).addResourceLocations("file:" + uploadFolder);
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/exception/RenExceptionHandler.java b/bdty-admin/src/main/java/io/bdty/common/exception/RenExceptionHandler.java
new file mode 100644
index 0000000..df3d188
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/exception/RenExceptionHandler.java
@@ -0,0 +1,95 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.exception;
+
+import cn.hutool.core.map.MapUtil;
+import io.bdty.common.exception.ErrorCode;
+import io.bdty.common.exception.ExceptionUtils;
+import io.bdty.common.exception.RenException;
+import io.bdty.common.utils.HttpContextUtils;
+import io.bdty.common.utils.IpUtils;
+import io.bdty.common.utils.JsonUtils;
+import io.bdty.common.utils.Result;
+import io.bdty.modules.log.entity.SysLogErrorEntity;
+import io.bdty.modules.log.service.SysLogErrorService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+
+/**
+ * 异常处理器
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Slf4j
+@RestControllerAdvice
+@AllArgsConstructor
+public class RenExceptionHandler {
+ private final SysLogErrorService sysLogErrorService;
+
+ /**
+ * 处理自定义异常
+ */
+ @ExceptionHandler(RenException.class)
+ public Result handleRenException(RenException ex) {
+ Result result = new Result();
+ result.error(ex.getCode(), ex.getMsg());
+
+ return result;
+ }
+
+ @ExceptionHandler(DuplicateKeyException.class)
+ public Result handleDuplicateKeyException(DuplicateKeyException ex) {
+ Result result = new Result();
+ result.error(ErrorCode.DB_RECORD_EXISTS);
+
+ return result;
+ }
+
+ @ExceptionHandler(Exception.class)
+ public Result handleException(Exception ex) {
+ log.error(ex.getMessage(), ex);
+
+ saveLog(ex);
+
+ return new Result().error();
+ }
+
+ /**
+ * 保存异常日志
+ */
+ private void saveLog(Exception ex) {
+ SysLogErrorEntity log = new SysLogErrorEntity();
+
+ //请求相关信息
+ HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
+ log.setIp(IpUtils.getIpAddr(request));
+ log.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));
+ log.setRequestUri(request.getRequestURI());
+ log.setRequestMethod(request.getMethod());
+ Map params = HttpContextUtils.getParameterMap(request);
+ if (MapUtil.isNotEmpty(params)) {
+ log.setRequestParams(JsonUtils.toJsonString(params));
+ }
+
+ //异常信息
+ log.setErrorInfo(ExceptionUtils.getErrorStackTrace(ex));
+
+ //保存
+ sysLogErrorService.save(log);
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/handler/FieldMetaObjectHandler.java b/bdty-admin/src/main/java/io/bdty/common/handler/FieldMetaObjectHandler.java
new file mode 100644
index 0000000..391b925
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/handler/FieldMetaObjectHandler.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.handler;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+
+import io.bdty.modules.security.user.SecurityUser;
+import io.bdty.modules.security.user.UserDetail;
+
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+/**
+ * 公共字段,自动填充值
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Component
+public class FieldMetaObjectHandler implements MetaObjectHandler {
+ private final static String CREATE_DATE = "createDate";
+ private final static String CREATOR = "creator";
+ private final static String UPDATE_DATE = "updateDate";
+ private final static String UPDATER = "updater";
+ private final static String DEPT_ID = "deptId";
+
+ @Override
+ public void insertFill(MetaObject metaObject) {
+ UserDetail user = SecurityUser.getUser();
+ Date date = new Date();
+
+ //创建者
+ strictInsertFill(metaObject, CREATOR, Long.class, user.getId());
+ //创建时间
+ strictInsertFill(metaObject, CREATE_DATE, Date.class, date);
+
+ //创建者所属部门
+ strictInsertFill(metaObject, DEPT_ID, Long.class, user.getDeptId());
+
+ //更新者
+ strictInsertFill(metaObject, UPDATER, Long.class, user.getId());
+ //更新时间
+ strictInsertFill(metaObject, UPDATE_DATE, Date.class, date);
+ }
+
+ @Override
+ public void updateFill(MetaObject metaObject) {
+ //更新者
+ strictUpdateFill(metaObject, UPDATER, Long.class, SecurityUser.getUserId());
+ //更新时间
+ strictUpdateFill(metaObject, UPDATE_DATE, Date.class, new Date());
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/interceptor/DataFilterInterceptor.java b/bdty-admin/src/main/java/io/bdty/common/interceptor/DataFilterInterceptor.java
new file mode 100644
index 0000000..8717efb
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/interceptor/DataFilterInterceptor.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.interceptor;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.StringValue;
+import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.parser.CCJSqlParserUtil;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.Select;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+
+import java.util.Map;
+
+/**
+ * 数据过滤
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class DataFilterInterceptor implements InnerInterceptor {
+
+ @Override
+ public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
+ DataScope scope = getDataScope(parameter);
+ // 不进行数据过滤
+ if(scope == null || StrUtil.isBlank(scope.getSqlFilter())){
+ return;
+ }
+
+ // 拼接新SQL
+ String buildSql = getSelect(boundSql.getSql(), scope);
+
+ // 重写SQL
+ PluginUtils.mpBoundSql(boundSql).sql(buildSql);
+ }
+
+ private DataScope getDataScope(Object parameter){
+ if (parameter == null){
+ return null;
+ }
+
+ // 判断参数里是否有DataScope对象
+ if (parameter instanceof Map) {
+ Map, ?> parameterMap = (Map, ?>) parameter;
+ for (Map.Entry entry : parameterMap.entrySet()) {
+ if (entry.getValue() != null && entry.getValue() instanceof DataScope) {
+ return (DataScope) entry.getValue();
+ }
+ }
+ } else if (parameter instanceof DataScope) {
+ return (DataScope) parameter;
+ }
+
+ return null;
+ }
+
+ private String getSelect(String buildSql, DataScope scope){
+ try {
+ Select select = (Select) CCJSqlParserUtil.parse(buildSql);
+ PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
+
+ Expression expression = plainSelect.getWhere();
+ if(expression == null){
+ plainSelect.setWhere(new StringValue(scope.getSqlFilter()));
+ }else{
+ AndExpression andExpression = new AndExpression(expression, new StringValue(scope.getSqlFilter()));
+ plainSelect.setWhere(andExpression);
+ }
+
+ return select.toString().replaceAll("'", "");
+ }catch (JSQLParserException e){
+ return buildSql;
+ }
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/interceptor/DataScope.java b/bdty-admin/src/main/java/io/bdty/common/interceptor/DataScope.java
new file mode 100644
index 0000000..ff51b5d
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/interceptor/DataScope.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.interceptor;
+
+/**
+ * 数据范围
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public class DataScope {
+ private String sqlFilter;
+
+ public DataScope(String sqlFilter) {
+ this.sqlFilter = sqlFilter;
+ }
+
+ public String getSqlFilter() {
+ return sqlFilter;
+ }
+
+ public void setSqlFilter(String sqlFilter) {
+ this.sqlFilter = sqlFilter;
+ }
+
+ @Override
+ public String toString() {
+ return this.sqlFilter;
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/common/utils/ExcelUtils.java b/bdty-admin/src/main/java/io/bdty/common/utils/ExcelUtils.java
new file mode 100644
index 0000000..86647d4
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/utils/ExcelUtils.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.utils;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.URLUtil;
+import io.bdty.common.utils.DateUtils;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.converters.longconverter.LongStringConverter;
+import org.springframework.beans.BeanUtils;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * excel工具类
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class ExcelUtils {
+
+ /**
+ * Excel导出
+ *
+ * @param response response
+ * @param fileName 文件名
+ * @param sheetName sheetName
+ * @param list 数据List
+ * @param pojoClass 对象Class
+ */
+ public static void exportExcel(HttpServletResponse response, String fileName, String sheetName, List> list,
+ Class> pojoClass) throws IOException {
+ if (StrUtil.isBlank(fileName)) {
+ //当前日期
+ fileName = DateUtils.format(new Date());
+ }
+
+ response.setContentType("application/vnd.ms-excel");
+ response.setCharacterEncoding("UTF-8");
+ fileName = URLUtil.encode(fileName, StandardCharsets.UTF_8);
+ response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+ EasyExcel.write(response.getOutputStream(), pojoClass).registerConverter(new LongStringConverter()).sheet(sheetName).doWrite(list);
+ }
+
+ /**
+ * Excel导出,先sourceList转换成List,再导出
+ *
+ * @param response response
+ * @param fileName 文件名
+ * @param sheetName sheetName
+ * @param sourceList 原数据List
+ * @param targetClass 目标对象Class
+ */
+ public static void exportExcelToTarget(HttpServletResponse response, String fileName, String sheetName, List> sourceList,
+ Class> targetClass) throws Exception {
+ List targetList = new ArrayList<>(sourceList.size());
+ for (Object source : sourceList) {
+ Object target = targetClass.newInstance();
+ BeanUtils.copyProperties(source, target);
+ targetList.add(target);
+ }
+
+ exportExcel(response, fileName, sheetName, targetList, targetClass);
+ }
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/common/validator/group/AliyunGroup.java b/bdty-admin/src/main/java/io/bdty/common/validator/group/AliyunGroup.java
new file mode 100644
index 0000000..4e94c6c
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/validator/group/AliyunGroup.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.validator.group;
+
+/**
+ * 阿里云
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface AliyunGroup {
+}
diff --git a/bdty-admin/src/main/java/io/bdty/common/validator/group/QcloudGroup.java b/bdty-admin/src/main/java/io/bdty/common/validator/group/QcloudGroup.java
new file mode 100644
index 0000000..ad40f4e
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/validator/group/QcloudGroup.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.validator.group;
+
+/**
+ * 腾讯云
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface QcloudGroup {
+}
diff --git a/bdty-admin/src/main/java/io/bdty/common/validator/group/QiniuGroup.java b/bdty-admin/src/main/java/io/bdty/common/validator/group/QiniuGroup.java
new file mode 100644
index 0000000..dafa2e9
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/common/validator/group/QiniuGroup.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.common.validator.group;
+
+/**
+ * 七牛
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface QiniuGroup {
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvArticleController.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvArticleController.java
new file mode 100644
index 0000000..1695eca
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvArticleController.java
@@ -0,0 +1,123 @@
+package io.bdty.modules.cniyv.controller;
+
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.ExcelUtils;
+import io.bdty.common.utils.Result;
+import io.bdty.common.validator.AssertUtils;
+import io.bdty.common.validator.ValidatorUtils;
+import io.bdty.common.validator.group.AddGroup;
+import io.bdty.common.validator.group.DefaultGroup;
+import io.bdty.common.validator.group.UpdateGroup;
+import io.bdty.modules.cniyv.dto.CniyvArticleDTO;
+import io.bdty.modules.cniyv.excel.CniyvArticleExcel;
+import io.bdty.modules.cniyv.service.CniyvArticleService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 文章
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@RestController
+@RequestMapping("cniyv/cniyvarticle")
+@Api(tags="文章")
+public class CniyvArticleController {
+ @Autowired
+ private CniyvArticleService cniyvArticleService;
+
+ @GetMapping("page")
+ @ApiOperation("分页")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String")
+ })
+ public Result> page(@ApiIgnore @RequestParam Map params){
+ PageData page = cniyvArticleService.page(params);
+
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("{id}")
+ @ApiOperation("信息")
+ @RequiresPermissions("cniyv:cniyvarticle:info")
+ public Result get(@PathVariable("id") Long id){
+ CniyvArticleDTO data = cniyvArticleService.get(id);
+
+ return new Result().ok(data);
+ }
+
+ @GetMapping("info/{id}")
+ @ApiOperation("详情")
+ public Result info(@PathVariable("id") Long id){
+ CniyvArticleDTO data = cniyvArticleService.get(id);
+
+ return new Result().ok(data);
+ }
+
+ @PostMapping
+ @ApiOperation("保存")
+ @LogOperation("保存")
+ @RequiresPermissions("cniyv:cniyvarticle:save")
+ public Result save(@RequestBody CniyvArticleDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
+
+ cniyvArticleService.save(dto);
+
+ return new Result();
+ }
+
+ @PutMapping
+ @ApiOperation("修改")
+ @LogOperation("修改")
+ @RequiresPermissions("cniyv:cniyvarticle:update")
+ public Result update(@RequestBody CniyvArticleDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
+
+ cniyvArticleService.update(dto);
+
+ return new Result();
+ }
+
+ @DeleteMapping
+ @ApiOperation("删除")
+ @LogOperation("删除")
+ @RequiresPermissions("cniyv:cniyvarticle:delete")
+ public Result delete(@RequestBody Long[] ids){
+ //效验数据
+ AssertUtils.isArrayEmpty(ids, "id");
+
+ cniyvArticleService.delete(ids);
+
+ return new Result();
+ }
+
+ @GetMapping("export")
+ @ApiOperation("导出")
+ @LogOperation("导出")
+ @RequiresPermissions("cniyv:cniyvarticle:export")
+ public void export(@ApiIgnore @RequestParam Map params, HttpServletResponse response) throws Exception {
+ List list = cniyvArticleService.list(params);
+
+ ExcelUtils.exportExcelToTarget(response, null, "文章", list, CniyvArticleExcel.class);
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvArticleTypeController.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvArticleTypeController.java
new file mode 100644
index 0000000..d8c5895
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvArticleTypeController.java
@@ -0,0 +1,123 @@
+package io.bdty.modules.cniyv.controller;
+
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.ExcelUtils;
+import io.bdty.common.utils.Result;
+import io.bdty.common.validator.AssertUtils;
+import io.bdty.common.validator.ValidatorUtils;
+import io.bdty.common.validator.group.AddGroup;
+import io.bdty.common.validator.group.DefaultGroup;
+import io.bdty.common.validator.group.UpdateGroup;
+import io.bdty.modules.cniyv.dto.CniyvArticleTypeDTO;
+import io.bdty.modules.cniyv.excel.CniyvArticleTypeExcel;
+import io.bdty.modules.cniyv.service.CniyvArticleTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 文章分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@RestController
+@RequestMapping("cniyv/cniyvarticletype")
+@Api(tags="文章分类")
+public class CniyvArticleTypeController {
+ @Autowired
+ private CniyvArticleTypeService cniyvArticleTypeService;
+
+ @GetMapping("page")
+ @ApiOperation("分页")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String")
+ })
+ public Result> page(@ApiIgnore @RequestParam Map params){
+ PageData page = cniyvArticleTypeService.page(params);
+
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("{id}")
+ @ApiOperation("信息")
+ @RequiresPermissions("cniyv:cniyvarticletype:info")
+ public Result get(@PathVariable("id") Long id){
+ CniyvArticleTypeDTO data = cniyvArticleTypeService.get(id);
+
+ return new Result().ok(data);
+ }
+
+ @GetMapping("info/{id}")
+ @ApiOperation("详情")
+ public Result info(@PathVariable("id") Long id){
+ CniyvArticleTypeDTO data = cniyvArticleTypeService.get(id);
+
+ return new Result().ok(data);
+ }
+
+ @PostMapping
+ @ApiOperation("保存")
+ @LogOperation("保存")
+ @RequiresPermissions("cniyv:cniyvarticletype:save")
+ public Result save(@RequestBody CniyvArticleTypeDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
+
+ cniyvArticleTypeService.save(dto);
+
+ return new Result();
+ }
+
+ @PutMapping
+ @ApiOperation("修改")
+ @LogOperation("修改")
+ @RequiresPermissions("cniyv:cniyvarticletype:update")
+ public Result update(@RequestBody CniyvArticleTypeDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
+
+ cniyvArticleTypeService.update(dto);
+
+ return new Result();
+ }
+
+ @DeleteMapping
+ @ApiOperation("删除")
+ @LogOperation("删除")
+ @RequiresPermissions("cniyv:cniyvarticletype:delete")
+ public Result delete(@RequestBody Long[] ids){
+ //效验数据
+ AssertUtils.isArrayEmpty(ids, "id");
+
+ cniyvArticleTypeService.delete(ids);
+
+ return new Result();
+ }
+
+ @GetMapping("export")
+ @ApiOperation("导出")
+ @LogOperation("导出")
+ @RequiresPermissions("cniyv:cniyvarticletype:export")
+ public void export(@ApiIgnore @RequestParam Map params, HttpServletResponse response) throws Exception {
+ List list = cniyvArticleTypeService.list(params);
+
+ ExcelUtils.exportExcelToTarget(response, null, "文章分类", list, CniyvArticleTypeExcel.class);
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvProductController.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvProductController.java
new file mode 100644
index 0000000..bf20f0c
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvProductController.java
@@ -0,0 +1,164 @@
+package io.bdty.modules.cniyv.controller;
+
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.ExcelUtils;
+import io.bdty.common.utils.Result;
+import io.bdty.common.validator.AssertUtils;
+import io.bdty.common.validator.ValidatorUtils;
+import io.bdty.common.validator.group.AddGroup;
+import io.bdty.common.validator.group.DefaultGroup;
+import io.bdty.common.validator.group.UpdateGroup;
+import io.bdty.modules.cniyv.dto.CniyvProductDTO;
+import io.bdty.modules.cniyv.dto.CniyvProductTypeDTO;
+import io.bdty.modules.cniyv.excel.CniyvProductExcel;
+import io.bdty.modules.cniyv.service.CniyvProductService;
+import io.bdty.modules.cniyv.service.CniyvProductTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 产品
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-12
+ */
+@RestController
+@RequestMapping("cniyv/cniyvproduct")
+@Api(tags="产品")
+public class CniyvProductController {
+ @Autowired
+ private CniyvProductService cniyvProductService;
+ @Autowired
+ private CniyvProductTypeService cniyvProductTypeService;
+ @GetMapping("page")
+ @ApiOperation("分页")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String")
+ })
+ public Result> page(@ApiIgnore @RequestParam Map params){
+ PageData page = cniyvProductService.page(params);
+
+ for (CniyvProductDTO product : page.getList()) {
+ if (product.getTypeid()!=null) {
+ CniyvProductTypeDTO typeDTO = cniyvProductTypeService.get(product.getTypeid());
+ product.setType(typeDTO!=null?typeDTO.getName():"");
+ }
+
+ }
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("{id}")
+ @ApiOperation("信息")
+ @RequiresPermissions("cniyv:cniyvproduct:info")
+ public Result get(@PathVariable("id") Long id){
+ CniyvProductDTO data = cniyvProductService.get(id);
+ if (data.getTypeid()!=null) {
+ CniyvProductTypeDTO typeDTO = cniyvProductTypeService.get(data.getTypeid());
+ data.setType(typeDTO!=null?typeDTO.getName():"");
+ }
+ return new Result().ok(data);
+ }
+
+ @GetMapping("info/{id}")
+ @ApiOperation("详情")
+ public Result info(@PathVariable("id") Long id){
+ CniyvProductDTO data = cniyvProductService.get(id);
+ if (data.getTypeid()!=null) {
+ CniyvProductTypeDTO typeDTO = cniyvProductTypeService.get(data.getTypeid());
+ data.setType(typeDTO!=null?typeDTO.getName():"");
+ }
+ return new Result().ok(data);
+ }
+
+ @PostMapping
+ @ApiOperation("保存")
+ @LogOperation("保存")
+ @RequiresPermissions("cniyv:cniyvproduct:save")
+ public Result save(@RequestBody CniyvProductDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
+ try {
+ String content = URLDecoder.decode(dto.getContent(), "UTF-8");
+ dto.setContent(content);
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ cniyvProductService.save(dto);
+
+ return new Result();
+ }
+
+ @PutMapping
+ @ApiOperation("修改")
+ @LogOperation("修改")
+ @RequiresPermissions("cniyv:cniyvproduct:update")
+ public Result update(@RequestBody CniyvProductDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
+ try {
+ String content = URLDecoder.decode(dto.getContent(), "UTF-8");
+ dto.setContent(content);
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ cniyvProductService.update(dto);
+
+ return new Result();
+ }
+
+ @DeleteMapping
+ @ApiOperation("删除")
+ @LogOperation("删除")
+ @RequiresPermissions("cniyv:cniyvproduct:delete")
+ public Result delete(@RequestBody Long[] ids){
+ //效验数据
+ AssertUtils.isArrayEmpty(ids, "id");
+
+ cniyvProductService.delete(ids);
+
+ return new Result();
+ }
+
+ @GetMapping("export")
+ @ApiOperation("导出")
+ @LogOperation("导出")
+ @RequiresPermissions("cniyv:cniyvproduct:export")
+ public void export(@ApiIgnore @RequestParam Map params, HttpServletResponse response) throws Exception {
+ List list = cniyvProductService.list(params);
+
+ ExcelUtils.exportExcelToTarget(response, null, "产品", list, CniyvProductExcel.class);
+ }
+
+ @GetMapping("list")
+ @ApiOperation("列表")
+ public Result> list(@ApiIgnore @RequestParam Map params) {
+ List list = cniyvProductService.list(params);
+ return new Result>().ok(list);
+ }
+
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvProductTypeController.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvProductTypeController.java
new file mode 100644
index 0000000..ee920e5
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/controller/CniyvProductTypeController.java
@@ -0,0 +1,180 @@
+package io.bdty.modules.cniyv.controller;
+
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.ExcelUtils;
+import io.bdty.common.utils.Result;
+import io.bdty.common.validator.AssertUtils;
+import io.bdty.common.validator.ValidatorUtils;
+import io.bdty.common.validator.group.AddGroup;
+import io.bdty.common.validator.group.DefaultGroup;
+import io.bdty.common.validator.group.UpdateGroup;
+import io.bdty.modules.cniyv.dto.CniyvProductDTO;
+import io.bdty.modules.cniyv.dto.CniyvProductTypeDTO;
+import io.bdty.modules.cniyv.excel.CniyvProductTypeExcel;
+import io.bdty.modules.cniyv.service.CniyvProductService;
+import io.bdty.modules.cniyv.service.CniyvProductTypeService;
+import io.bdty.modules.sys.dto.SysMenuDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+
+import org.apache.poi.poifs.property.Parent;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 产品分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@RestController
+@RequestMapping("cniyv/cniyvproducttype")
+@Api(tags="产品分类")
+public class CniyvProductTypeController {
+ @Autowired
+ private CniyvProductTypeService cniyvProductTypeService;
+
+ @Autowired
+ private CniyvProductService cniyvProductService;
+
+ @GetMapping("page")
+ @ApiOperation("分页")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int") ,
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String")
+ })
+ public Result> page(@ApiIgnore @RequestParam Map params){
+ PageData page = cniyvProductTypeService.page(params);
+ for (CniyvProductTypeDTO cniyvProductTypeDTO : page.getList()) {
+ if (cniyvProductTypeDTO.getParentid()!=null) {
+ CniyvProductTypeDTO parent = cniyvProductTypeService.get(cniyvProductTypeDTO.getParentid());
+ cniyvProductTypeDTO.setParentName(parent!=null?parent.getName():"");
+ }
+ }
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("{id}")
+ @ApiOperation("信息")
+ @RequiresPermissions("cniyv:cniyvproducttype:info")
+ public Result get(@PathVariable("id") Long id){
+ CniyvProductTypeDTO data = cniyvProductTypeService.get(id);
+ CniyvProductTypeDTO parent = cniyvProductTypeService.get(data.getParentid());
+ data.setParentName(parent!=null?parent.getName():"");
+ return new Result().ok(data);
+ }
+
+ @GetMapping("info/{id}")
+ @ApiOperation("详情")
+ public Result info(@PathVariable("id") Long id){
+ CniyvProductTypeDTO data = cniyvProductTypeService.get(id);
+ CniyvProductTypeDTO parent = cniyvProductTypeService.get(data.getParentid());
+ data.setParentName(parent!=null?parent.getName():"");
+ return new Result().ok(data);
+ }
+
+ @PostMapping
+ @ApiOperation("保存")
+ @LogOperation("保存")
+ @RequiresPermissions("cniyv:cniyvproducttype:save")
+ public Result save(@RequestBody CniyvProductTypeDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
+
+ cniyvProductTypeService.save(dto);
+
+ return new Result();
+ }
+
+ @PutMapping
+ @ApiOperation("修改")
+ @LogOperation("修改")
+ @RequiresPermissions("cniyv:cniyvproducttype:update")
+ public Result update(@RequestBody CniyvProductTypeDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
+
+ cniyvProductTypeService.update(dto);
+
+ return new Result();
+ }
+
+ @DeleteMapping
+ @ApiOperation("删除")
+ @LogOperation("删除")
+ @RequiresPermissions("cniyv:cniyvproducttype:delete")
+ public Result delete(@RequestBody Long[] ids){
+ //效验数据
+ AssertUtils.isArrayEmpty(ids, "id");
+
+ cniyvProductTypeService.delete(ids);
+
+ return new Result();
+ }
+
+ @GetMapping("export")
+ @ApiOperation("导出")
+ @LogOperation("导出")
+ @RequiresPermissions("cniyv:cniyvproducttype:export")
+ public void export(@ApiIgnore @RequestParam Map params, HttpServletResponse response) throws Exception {
+ List list = cniyvProductTypeService.list(params);
+
+ ExcelUtils.exportExcelToTarget(response, null, "产品分类", list, CniyvProductTypeExcel.class);
+ }
+
+ @GetMapping("list")
+ @ApiOperation("列表")
+ public Result> list(@ApiIgnore @RequestParam Map params) {
+ List list = cniyvProductTypeService.list(params);
+ return new Result>().ok(list);
+ }
+
+ @GetMapping("listProduct")
+ @ApiOperation("产品分类含分类下产品列表")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType="int") ,
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType="String") ,
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType="String"),
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query",required = true, dataType="int")
+ })
+ public Result> listProduct(@ApiIgnore @RequestParam Map params){
+ PageData page = cniyvProductTypeService.page(params);
+ List list = page.getList();
+ Map productParams = new HashMap();
+ for (CniyvProductTypeDTO cniyvProductTypeDTO : list) {
+ productParams.put(Constant.PAGE, "1");
+ productParams.put(Constant.ORDER_FIELD, "count");
+ productParams.put(Constant.ORDER, "desc");
+ productParams.put(Constant.LIMIT, "4");
+ productParams.put("typeid", String.valueOf(cniyvProductTypeDTO.getPtsid()));
+ PageData productPage = cniyvProductService.page(productParams);
+ List productlist = productPage.getList();
+ for (CniyvProductDTO product : productlist) {
+ if (product.getTypeid()!=null) {
+ CniyvProductTypeDTO typeDTO = cniyvProductTypeService.get(product.getTypeid());
+ product.setType(typeDTO!=null?typeDTO.getName():"");
+ }
+
+ }
+ cniyvProductTypeDTO.setProductList(productlist);
+ }
+ return new Result>().ok(list);
+ }
+
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvArticleDao.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvArticleDao.java
new file mode 100644
index 0000000..fdb9c41
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvArticleDao.java
@@ -0,0 +1,16 @@
+package io.bdty.modules.cniyv.dao;
+
+import io.bdty.common.dao.BaseDao;
+import io.bdty.modules.cniyv.entity.CniyvArticleEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 文章
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Mapper
+public interface CniyvArticleDao extends BaseDao {
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvArticleTypeDao.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvArticleTypeDao.java
new file mode 100644
index 0000000..a0a2ebb
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvArticleTypeDao.java
@@ -0,0 +1,16 @@
+package io.bdty.modules.cniyv.dao;
+
+import io.bdty.common.dao.BaseDao;
+import io.bdty.modules.cniyv.entity.CniyvArticleTypeEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 文章分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Mapper
+public interface CniyvArticleTypeDao extends BaseDao {
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvProductDao.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvProductDao.java
new file mode 100644
index 0000000..1a441bd
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvProductDao.java
@@ -0,0 +1,16 @@
+package io.bdty.modules.cniyv.dao;
+
+import io.bdty.common.dao.BaseDao;
+import io.bdty.modules.cniyv.entity.CniyvProductEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 产品
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Mapper
+public interface CniyvProductDao extends BaseDao {
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvProductTypeDao.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvProductTypeDao.java
new file mode 100644
index 0000000..126295e
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dao/CniyvProductTypeDao.java
@@ -0,0 +1,16 @@
+package io.bdty.modules.cniyv.dao;
+
+import io.bdty.common.dao.BaseDao;
+import io.bdty.modules.cniyv.entity.CniyvProductTypeEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 产品分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Mapper
+public interface CniyvProductTypeDao extends BaseDao {
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvArticleDTO.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvArticleDTO.java
new file mode 100644
index 0000000..f399576
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvArticleDTO.java
@@ -0,0 +1,50 @@
+package io.bdty.modules.cniyv.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 文章
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+@ApiModel(value = "文章")
+public class CniyvArticleDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "")
+ private Long ptsid;
+
+ @ApiModelProperty(value = "")
+ private String title;
+
+ @ApiModelProperty(value = "")
+ private String content;
+
+ @ApiModelProperty(value = "")
+ private Long typeid;
+
+ @ApiModelProperty(value = "")
+ private Long creator;
+
+ @ApiModelProperty(value = "")
+ private Integer taix;
+
+ @ApiModelProperty(value = "")
+ private String thumbnail;
+
+ @ApiModelProperty(value = "统计")
+ private Integer count;
+
+ @ApiModelProperty(value = "")
+ private Date createDate;
+
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvArticleTypeDTO.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvArticleTypeDTO.java
new file mode 100644
index 0000000..a1e13cf
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvArticleTypeDTO.java
@@ -0,0 +1,53 @@
+package io.bdty.modules.cniyv.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 文章分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+@ApiModel(value = "文章分类")
+public class CniyvArticleTypeDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "")
+ private Long ptsid;
+
+ @ApiModelProperty(value = "")
+ private Integer zntid;
+
+ @ApiModelProperty(value = "")
+ private String name;
+
+ @ApiModelProperty(value = "")
+ private Integer parentid;
+
+ @ApiModelProperty(value = "")
+ private Integer selectid;
+
+ @ApiModelProperty(value = "")
+ private String link;
+
+ @ApiModelProperty(value = "")
+ private String thumbnail;
+
+ @ApiModelProperty(value = "")
+ private Integer sort;
+
+ @ApiModelProperty(value = "")
+ private Long creator;
+
+ @ApiModelProperty(value = "")
+ private Date createDate;
+
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvProductDTO.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvProductDTO.java
new file mode 100644
index 0000000..1748ed4
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvProductDTO.java
@@ -0,0 +1,75 @@
+package io.bdty.modules.cniyv.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 产品
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+@ApiModel(value = "产品")
+public class CniyvProductDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "")
+ private Long ptsid;
+
+ @ApiModelProperty(value = "")
+ private String title;
+
+ @ApiModelProperty(value = "")
+ private String content;
+
+ @ApiModelProperty(value = "产品优势")
+ private String content1;
+
+ @ApiModelProperty(value = "产品特点")
+ private String content2;
+
+ @ApiModelProperty(value = "产品参数")
+ private String content3;
+
+ @ApiModelProperty(value = "价格")
+ private Float price;
+
+ @ApiModelProperty(value = "市场价")
+ private String nprice;
+
+ @ApiModelProperty(value = "数量")
+ private Integer quantity;
+
+ @ApiModelProperty(value = "")
+ private Long typeid;
+
+ @ApiModelProperty(value = "")
+ private Long creator;
+
+ @ApiModelProperty(value = "")
+ private Integer taix;
+
+ @ApiModelProperty(value = "")
+ private String thumbnail;
+
+ @ApiModelProperty(value = "统计")
+ private Integer count;
+
+ @ApiModelProperty(value = "")
+ private Date createDate;
+
+
+ @ApiModelProperty(value = "类型名称")
+ private String type;
+
+ @ApiModelProperty(value = "展示图")
+ private String imgs;
+
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvProductTypeDTO.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvProductTypeDTO.java
new file mode 100644
index 0000000..a036e29
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/dto/CniyvProductTypeDTO.java
@@ -0,0 +1,59 @@
+package io.bdty.modules.cniyv.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 产品分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+@ApiModel(value = "产品分类")
+public class CniyvProductTypeDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "")
+ private Long ptsid;
+
+ @ApiModelProperty(value = "")
+ private Integer zntid;
+
+ @ApiModelProperty(value = "")
+ private String name;
+
+ @ApiModelProperty(value = "")
+ private Long parentid;
+
+ @ApiModelProperty(value = "")
+ private Integer selectid;
+
+ @ApiModelProperty(value = "")
+ private String link;
+
+ @ApiModelProperty(value = "")
+ private String thumbnail;
+
+ @ApiModelProperty(value = "")
+ private Integer sort;
+
+ @ApiModelProperty(value = "")
+ private Long creator;
+
+ @ApiModelProperty(value = "")
+ private Date createDate;
+
+ @ApiModelProperty(value = "")
+ private String parentName;
+
+ @ApiModelProperty(value = "产品列表")
+ private List productList;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvArticleEntity.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvArticleEntity.java
new file mode 100644
index 0000000..6661dff
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvArticleEntity.java
@@ -0,0 +1,62 @@
+package io.bdty.modules.cniyv.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 文章
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+@TableName("cniyv_article")
+public class CniyvArticleEntity {
+
+ /**
+ *
+ */
+ @TableId
+ private Long ptsid;
+ /**
+ *
+ */
+ private String title;
+ /**
+ *
+ */
+ private String content;
+ /**
+ *
+ */
+ private Long typeid;
+ /**
+ *
+ */
+ @TableField(fill = FieldFill.INSERT)
+ private Long creator;
+ /**
+ *
+ */
+ private Integer taix;
+ /**
+ *
+ */
+ private String thumbnail;
+ /**
+ * 统计
+ */
+ private Integer count;
+ /**
+ *
+ */
+ @TableField(fill = FieldFill.INSERT)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createDate;
+ }
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvArticleTypeEntity.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvArticleTypeEntity.java
new file mode 100644
index 0000000..5cc46ea
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvArticleTypeEntity.java
@@ -0,0 +1,66 @@
+package io.bdty.modules.cniyv.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 文章分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+@TableName("cniyv_article_type")
+public class CniyvArticleTypeEntity {
+
+ /**
+ *
+ */
+ @TableId
+ private Long ptsid;
+ /**
+ *
+ */
+ private Integer zntid;
+ /**
+ *
+ */
+ private String name;
+ /**
+ *
+ */
+ private Integer parentid;
+ /**
+ *
+ */
+ private Integer selectid;
+ /**
+ *
+ */
+ private String link;
+ /**
+ *
+ */
+ private String thumbnail;
+ /**
+ *
+ */
+ private Integer sort;
+ /**
+ *
+ */
+ @TableField(fill = FieldFill.INSERT)
+ private Long creator;
+ /**
+ *
+ */
+ @TableField(fill = FieldFill.INSERT)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createDate;
+ }
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvProductEntity.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvProductEntity.java
new file mode 100644
index 0000000..8d55770
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvProductEntity.java
@@ -0,0 +1,90 @@
+package io.bdty.modules.cniyv.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 产品
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+@TableName("cniyv_product")
+public class CniyvProductEntity {
+
+ /**
+ *
+ */
+ @TableId
+ private Long ptsid;
+ /**
+ *
+ */
+ private String title;
+ /**
+ *
+ */
+ private String content;
+ /**
+ * 产品优势
+ */
+ private String content1;
+ /**
+ * 产品特点
+ */
+ private String content2;
+ /**
+ * 产品参数
+ */
+ private String content3;
+ /**
+ * 价格
+ */
+ private Float price;
+ /**
+ * 市场价
+ */
+ private String nprice;
+ /**
+ * 数量
+ */
+ private Integer quantity;
+ /**
+ *
+ */
+ private Long typeid;
+ /**
+ *
+ */
+ @TableField(fill = FieldFill.INSERT)
+ private Long creator;
+ /**
+ *
+ */
+ private Integer taix;
+ /**
+ *
+ */
+ private String thumbnail;
+ /**
+ * 统计
+ */
+ private Integer count;
+
+ /** 展示图
+ */
+ private String imgs;
+ /**
+ *
+ */
+ @TableField(fill = FieldFill.INSERT)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createDate;
+ }
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvProductTypeEntity.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvProductTypeEntity.java
new file mode 100644
index 0000000..e602760
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/entity/CniyvProductTypeEntity.java
@@ -0,0 +1,66 @@
+package io.bdty.modules.cniyv.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 产品分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+@TableName("cniyv_product_type")
+public class CniyvProductTypeEntity {
+
+ /**
+ *
+ */
+ @TableId
+ private Long ptsid;
+ /**
+ *
+ */
+ private Integer zntid;
+ /**
+ *
+ */
+ private String name;
+ /**
+ *
+ */
+ private Long parentid;
+ /**
+ *
+ */
+ private Integer selectid;
+ /**
+ *
+ */
+ private String link;
+ /**
+ *
+ */
+ private String thumbnail;
+ /**
+ *
+ */
+ private Integer sort;
+ /**
+ *
+ */
+ @TableField(fill = FieldFill.INSERT)
+ private Long creator;
+ /**
+ *
+ */
+ @TableField(fill = FieldFill.INSERT)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createDate;
+ }
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvArticleExcel.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvArticleExcel.java
new file mode 100644
index 0000000..8f97fbf
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvArticleExcel.java
@@ -0,0 +1,38 @@
+package io.bdty.modules.cniyv.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 文章
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+public class CniyvArticleExcel {
+ @ExcelProperty(value = "")
+ private Long ptsid;
+ @ExcelProperty(value = "")
+ private String title;
+ @ExcelProperty(value = "")
+ private String content;
+ @ExcelProperty(value = "")
+ private Long typeid;
+ @ExcelProperty(value = "")
+ private Long creator;
+ @ExcelProperty(value = "")
+ private Integer taix;
+ @ExcelProperty(value = "")
+ private String thumbnail;
+ @ExcelProperty(value = "统计")
+ private Integer count;
+ @ExcelProperty(value = "")
+ private Date createDate;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvArticleTypeExcel.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvArticleTypeExcel.java
new file mode 100644
index 0000000..76f7ba2
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvArticleTypeExcel.java
@@ -0,0 +1,40 @@
+package io.bdty.modules.cniyv.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 文章分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+public class CniyvArticleTypeExcel {
+ @ExcelProperty(value = "")
+ private Long ptsid;
+ @ExcelProperty(value = "")
+ private Integer zntid;
+ @ExcelProperty(value = "")
+ private String name;
+ @ExcelProperty(value = "")
+ private Integer parentid;
+ @ExcelProperty(value = "")
+ private Integer selectid;
+ @ExcelProperty(value = "")
+ private String link;
+ @ExcelProperty(value = "")
+ private String thumbnail;
+ @ExcelProperty(value = "")
+ private Integer sort;
+ @ExcelProperty(value = "")
+ private Long creator;
+ @ExcelProperty(value = "")
+ private Date createDate;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvProductExcel.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvProductExcel.java
new file mode 100644
index 0000000..421e404
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvProductExcel.java
@@ -0,0 +1,50 @@
+package io.bdty.modules.cniyv.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 产品
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+public class CniyvProductExcel {
+ @ExcelProperty(value = "")
+ private Long ptsid;
+ @ExcelProperty(value = "")
+ private String title;
+ @ExcelProperty(value = "")
+ private String content;
+ @ExcelProperty(value = "产品优势")
+ private String content1;
+ @ExcelProperty(value = "产品特点")
+ private String content2;
+ @ExcelProperty(value = "产品参数")
+ private String content3;
+ @ExcelProperty(value = "价格")
+ private Float price;
+ @ExcelProperty(value = "市场价")
+ private String nprice;
+ @ExcelProperty(value = "数量")
+ private Integer quantity;
+ @ExcelProperty(value = "")
+ private Long typeid;
+ @ExcelProperty(value = "")
+ private Long creator;
+ @ExcelProperty(value = "")
+ private Integer taix;
+ @ExcelProperty(value = "")
+ private String thumbnail;
+ @ExcelProperty(value = "统计")
+ private Integer count;
+ @ExcelProperty(value = "")
+ private Date createDate;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvProductListExcel.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvProductListExcel.java
new file mode 100644
index 0000000..e43d9e1
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvProductListExcel.java
@@ -0,0 +1,48 @@
+package io.bdty.modules.cniyv.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 产品
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0 2024-01-18
+ */
+@Data
+public class CniyvProductListExcel {
+ @ExcelProperty(value = "")
+ private Integer ptsid;
+ @ExcelProperty(value = "")
+ private String title;
+ @ExcelProperty(value = "")
+ private String content;
+ @ExcelProperty(value = "产品优势")
+ private String content1;
+ @ExcelProperty(value = "产品特点")
+ private String content2;
+ @ExcelProperty(value = "产品参数")
+ private String content3;
+ @ExcelProperty(value = "价格")
+ private Float price;
+ @ExcelProperty(value = "数量")
+ private Float quantity;
+ @ExcelProperty(value = "")
+ private Integer typeid;
+ @ExcelProperty(value = "")
+ private Integer admin;
+ @ExcelProperty(value = "")
+ private Integer taix;
+ @ExcelProperty(value = "")
+ private String thumbnail;
+ @ExcelProperty(value = "统计")
+ private Integer count;
+ @ExcelProperty(value = "")
+ private Integer addtime;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvProductTypeExcel.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvProductTypeExcel.java
new file mode 100644
index 0000000..e99ff9f
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/excel/CniyvProductTypeExcel.java
@@ -0,0 +1,40 @@
+package io.bdty.modules.cniyv.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 产品分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Data
+public class CniyvProductTypeExcel {
+ @ExcelProperty(value = "")
+ private Long ptsid;
+ @ExcelProperty(value = "")
+ private Integer zntid;
+ @ExcelProperty(value = "")
+ private String name;
+ @ExcelProperty(value = "")
+ private Integer parentid;
+ @ExcelProperty(value = "")
+ private Integer selectid;
+ @ExcelProperty(value = "")
+ private String link;
+ @ExcelProperty(value = "")
+ private String thumbnail;
+ @ExcelProperty(value = "")
+ private Integer sort;
+ @ExcelProperty(value = "")
+ private Long creator;
+ @ExcelProperty(value = "")
+ private Date createDate;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvArticleService.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvArticleService.java
new file mode 100644
index 0000000..f946aa6
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvArticleService.java
@@ -0,0 +1,15 @@
+package io.bdty.modules.cniyv.service;
+
+import io.bdty.common.service.CrudService;
+import io.bdty.modules.cniyv.dto.CniyvArticleDTO;
+import io.bdty.modules.cniyv.entity.CniyvArticleEntity;
+
+/**
+ * 文章
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+public interface CniyvArticleService extends CrudService {
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvArticleTypeService.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvArticleTypeService.java
new file mode 100644
index 0000000..c9db313
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvArticleTypeService.java
@@ -0,0 +1,15 @@
+package io.bdty.modules.cniyv.service;
+
+import io.bdty.common.service.CrudService;
+import io.bdty.modules.cniyv.dto.CniyvArticleTypeDTO;
+import io.bdty.modules.cniyv.entity.CniyvArticleTypeEntity;
+
+/**
+ * 文章分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+public interface CniyvArticleTypeService extends CrudService {
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvProductService.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvProductService.java
new file mode 100644
index 0000000..560c449
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvProductService.java
@@ -0,0 +1,15 @@
+package io.bdty.modules.cniyv.service;
+
+import io.bdty.common.service.CrudService;
+import io.bdty.modules.cniyv.dto.CniyvProductDTO;
+import io.bdty.modules.cniyv.entity.CniyvProductEntity;
+
+/**
+ * 产品
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+public interface CniyvProductService extends CrudService {
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvProductTypeService.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvProductTypeService.java
new file mode 100644
index 0000000..2a519b2
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/CniyvProductTypeService.java
@@ -0,0 +1,15 @@
+package io.bdty.modules.cniyv.service;
+
+import io.bdty.common.service.CrudService;
+import io.bdty.modules.cniyv.dto.CniyvProductTypeDTO;
+import io.bdty.modules.cniyv.entity.CniyvProductTypeEntity;
+
+/**
+ * 产品分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+public interface CniyvProductTypeService extends CrudService {
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvArticleServiceImpl.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvArticleServiceImpl.java
new file mode 100644
index 0000000..3dd0232
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvArticleServiceImpl.java
@@ -0,0 +1,34 @@
+package io.bdty.modules.cniyv.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import io.bdty.common.service.impl.CrudServiceImpl;
+import io.bdty.modules.cniyv.dao.CniyvArticleDao;
+import io.bdty.modules.cniyv.dto.CniyvArticleDTO;
+import io.bdty.modules.cniyv.entity.CniyvArticleEntity;
+import io.bdty.modules.cniyv.service.CniyvArticleService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * 文章
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Service
+public class CniyvArticleServiceImpl extends CrudServiceImpl implements CniyvArticleService {
+
+ @Override
+ public QueryWrapper getWrapper(Map params){
+ String id = (String)params.get("id");
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(StrUtil.isNotBlank(id), "id", id);
+
+ return wrapper;
+ }
+
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvArticleTypeServiceImpl.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvArticleTypeServiceImpl.java
new file mode 100644
index 0000000..a7ad0b8
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvArticleTypeServiceImpl.java
@@ -0,0 +1,34 @@
+package io.bdty.modules.cniyv.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import io.bdty.common.service.impl.CrudServiceImpl;
+import io.bdty.modules.cniyv.dao.CniyvArticleTypeDao;
+import io.bdty.modules.cniyv.dto.CniyvArticleTypeDTO;
+import io.bdty.modules.cniyv.entity.CniyvArticleTypeEntity;
+import io.bdty.modules.cniyv.service.CniyvArticleTypeService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * 文章分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Service
+public class CniyvArticleTypeServiceImpl extends CrudServiceImpl implements CniyvArticleTypeService {
+
+ @Override
+ public QueryWrapper getWrapper(Map params){
+ String id = (String)params.get("id");
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(StrUtil.isNotBlank(id), "id", id);
+
+ return wrapper;
+ }
+
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvProductServiceImpl.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvProductServiceImpl.java
new file mode 100644
index 0000000..b7caabb
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvProductServiceImpl.java
@@ -0,0 +1,47 @@
+package io.bdty.modules.cniyv.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.service.impl.CrudServiceImpl;
+import io.bdty.modules.cniyv.dao.CniyvProductDao;
+import io.bdty.modules.cniyv.dto.CniyvProductDTO;
+import io.bdty.modules.cniyv.entity.CniyvProductEntity;
+import io.bdty.modules.cniyv.service.CniyvProductService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * 产品
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-12
+ */
+@Service
+public class CniyvProductServiceImpl extends CrudServiceImpl implements CniyvProductService {
+
+ @Override
+ public QueryWrapper getWrapper(Map params){
+ String id = (String)params.get("id");
+ String typeid = (String)params.get("typeid");
+// String orderField = (String)params.get("orderField");
+// String order = (String)params.get("order");
+// boolean isAsc = true;
+// if (order!=null) {
+// if (order.equals(Constant.DESC)) {
+// isAsc = false;
+// }
+// }
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(StrUtil.isNotBlank(id), "id", id);
+ wrapper.eq(StrUtil.isNotBlank(typeid), "typeid", typeid);
+ //wrapper.orderBy(StrUtil.isNotBlank(orderField), isAsc, orderField);
+
+ return wrapper;
+ }
+
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvProductTypeServiceImpl.java b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvProductTypeServiceImpl.java
new file mode 100644
index 0000000..1dfb576
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/cniyv/service/impl/CniyvProductTypeServiceImpl.java
@@ -0,0 +1,44 @@
+package io.bdty.modules.cniyv.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.service.impl.CrudServiceImpl;
+import io.bdty.modules.cniyv.dao.CniyvProductTypeDao;
+import io.bdty.modules.cniyv.dto.CniyvProductTypeDTO;
+import io.bdty.modules.cniyv.entity.CniyvProductTypeEntity;
+import io.bdty.modules.cniyv.service.CniyvProductTypeService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * 产品分类
+ *
+ * @author zxj zxj
+ * @since 1.0.0 2024-03-13
+ */
+@Service
+public class CniyvProductTypeServiceImpl extends CrudServiceImpl implements CniyvProductTypeService {
+
+ @Override
+ public QueryWrapper getWrapper(Map params){
+ String id = (String)params.get("id");
+// String orderField = (String)params.get("orderField");
+// String order = (String)params.get("order");
+// boolean isAsc = true;
+// if (order!=null) {
+// if (order.equals(Constant.DESC)) {
+// isAsc = false;
+// }
+// }
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(StrUtil.isNotBlank(id), "id", id);
+// wrapper.orderBy(StrUtil.isNotBlank(orderField), isAsc, orderField);
+ return wrapper;
+ }
+
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/config/ScheduleConfig.java b/bdty-admin/src/main/java/io/bdty/modules/job/config/ScheduleConfig.java
new file mode 100644
index 0000000..7bad44e
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/config/ScheduleConfig.java
@@ -0,0 +1,67 @@
+package io.bdty.modules.job.config;
+///**
+// * Copyright (c) 2018 人人开源 All rights reserved.
+// *
+// * https://www.renren.io
+// *
+// * 版权所有,侵权必究!
+// */
+//
+//package io.bdty.modules.job.config;
+//
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+//
+//import javax.sql.DataSource;
+//import java.util.Properties;
+//
+///**
+// * 定时任务配置(备注:集群需要打开注释)
+// *
+// * @author Mark sunlightcs@gmail.com
+// */
+//@Configuration
+//public class ScheduleConfig {
+//
+// @Bean
+// public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
+// SchedulerFactoryBean factory = new SchedulerFactoryBean();
+// factory.setDataSource(dataSource);
+//
+// //quartz参数
+// Properties prop = new Properties();
+// prop.put("org.quartz.scheduler.instanceName", "RenrenScheduler");
+// prop.put("org.quartz.scheduler.instanceId", "AUTO");
+// //线程池配置
+// prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
+// prop.put("org.quartz.threadPool.threadCount", "20");
+// prop.put("org.quartz.threadPool.threadPriority", "5");
+// //JobStore配置
+// prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
+// //集群配置
+// prop.put("org.quartz.jobStore.isClustered", "true");
+// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
+// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
+//
+// prop.put("org.quartz.jobStore.misfireThreshold", "12000");
+// prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
+// prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
+//
+// //PostgreSQL数据库,需要打开此注释
+// //prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");
+//
+// factory.setQuartzProperties(prop);
+//
+// factory.setSchedulerName("RenrenScheduler");
+// //延时启动
+// factory.setStartupDelay(30);
+// factory.setApplicationContextSchedulerContextKey("applicationContextKey");
+// //可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
+// factory.setOverwriteExistingJobs(true);
+// //设置自动启动,默认为true
+// factory.setAutoStartup(true);
+//
+// return factory;
+// }
+//}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/controller/ScheduleJobController.java b/bdty-admin/src/main/java/io/bdty/modules/job/controller/ScheduleJobController.java
new file mode 100644
index 0000000..1f7e120
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/controller/ScheduleJobController.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.controller;
+
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.Result;
+import io.bdty.common.validator.ValidatorUtils;
+import io.bdty.common.validator.group.AddGroup;
+import io.bdty.common.validator.group.DefaultGroup;
+import io.bdty.common.validator.group.UpdateGroup;
+import io.bdty.modules.job.dto.ScheduleJobDTO;
+import io.bdty.modules.job.service.ScheduleJobService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.util.Map;
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@RestController
+@RequestMapping("/sys/schedule")
+@Api(tags = "定时任务")
+@AllArgsConstructor
+public class ScheduleJobController {
+ private final ScheduleJobService scheduleJobService;
+
+ @GetMapping("page")
+ @ApiOperation("分页")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType = "String"),
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType = "String"),
+ @ApiImplicitParam(name = "beanName", value = "beanName", paramType = "query", dataType = "String")
+ })
+ @RequiresPermissions("sys:schedule:page")
+ public Result> page(@ApiIgnore @RequestParam Map params) {
+ PageData page = scheduleJobService.page(params);
+
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("{id}")
+ @ApiOperation("信息")
+ @RequiresPermissions("sys:schedule:info")
+ public Result info(@PathVariable("id") Long id) {
+ ScheduleJobDTO schedule = scheduleJobService.get(id);
+
+ return new Result().ok(schedule);
+ }
+
+ @PostMapping
+ @ApiOperation("保存")
+ @LogOperation("保存")
+ @RequiresPermissions("sys:schedule:save")
+ public Result save(@RequestBody ScheduleJobDTO dto) {
+ ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
+
+ scheduleJobService.save(dto);
+
+ return new Result();
+ }
+
+ @PutMapping
+ @ApiOperation("修改")
+ @LogOperation("修改")
+ @RequiresPermissions("sys:schedule:update")
+ public Result update(@RequestBody ScheduleJobDTO dto) {
+ ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
+
+ scheduleJobService.update(dto);
+
+ return new Result();
+ }
+
+ @DeleteMapping
+ @ApiOperation("删除")
+ @LogOperation("删除")
+ @RequiresPermissions("sys:schedule:delete")
+ public Result delete(@RequestBody Long[] ids) {
+ scheduleJobService.deleteBatch(ids);
+
+ return new Result();
+ }
+
+ @PutMapping("/run")
+ @ApiOperation("立即执行")
+ @LogOperation("立即执行")
+ @RequiresPermissions("sys:schedule:run")
+ public Result run(@RequestBody Long[] ids) {
+ scheduleJobService.run(ids);
+
+ return new Result();
+ }
+
+ @PutMapping("/pause")
+ @ApiOperation("暂停")
+ @LogOperation("暂停")
+ @RequiresPermissions("sys:schedule:pause")
+ public Result pause(@RequestBody Long[] ids) {
+ scheduleJobService.pause(ids);
+
+ return new Result();
+ }
+
+ @PutMapping("/resume")
+ @ApiOperation("恢复")
+ @LogOperation("恢复")
+ @RequiresPermissions("sys:schedule:resume")
+ public Result resume(@RequestBody Long[] ids) {
+ scheduleJobService.resume(ids);
+
+ return new Result();
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/controller/ScheduleJobLogController.java b/bdty-admin/src/main/java/io/bdty/modules/job/controller/ScheduleJobLogController.java
new file mode 100644
index 0000000..c6a9a06
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/controller/ScheduleJobLogController.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.controller;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.Result;
+import io.bdty.modules.job.dto.ScheduleJobLogDTO;
+import io.bdty.modules.job.service.ScheduleJobLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.util.Map;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@RestController
+@RequestMapping("/sys/scheduleLog")
+@Api(tags = "定时任务日志")
+@AllArgsConstructor
+public class ScheduleJobLogController {
+ private final ScheduleJobLogService scheduleJobLogService;
+
+ @GetMapping("page")
+ @ApiOperation("分页")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType = "String"),
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType = "String"),
+ @ApiImplicitParam(name = "jobId", value = "jobId", paramType = "query", dataType = "String")
+ })
+ @RequiresPermissions("sys:schedule:log")
+ public Result> page(@ApiIgnore @RequestParam Map params) {
+ PageData page = scheduleJobLogService.page(params);
+
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("{id}")
+ @ApiOperation("信息")
+ @RequiresPermissions("sys:schedule:log")
+ public Result info(@PathVariable("id") Long id) {
+ ScheduleJobLogDTO log = scheduleJobLogService.get(id);
+
+ return new Result().ok(log);
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/dao/ScheduleJobDao.java b/bdty-admin/src/main/java/io/bdty/modules/job/dao/ScheduleJobDao.java
new file mode 100644
index 0000000..fd032f9
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/dao/ScheduleJobDao.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.dao;
+
+import io.bdty.common.dao.BaseDao;
+import io.bdty.modules.job.entity.ScheduleJobEntity;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Map;
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Mapper
+public interface ScheduleJobDao extends BaseDao {
+
+ /**
+ * 批量更新状态
+ */
+ int updateBatch(Map map);
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/dao/ScheduleJobLogDao.java b/bdty-admin/src/main/java/io/bdty/modules/job/dao/ScheduleJobLogDao.java
new file mode 100644
index 0000000..210f9b2
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/dao/ScheduleJobLogDao.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.dao;
+
+import io.bdty.common.dao.BaseDao;
+import io.bdty.modules.job.entity.ScheduleJobLogEntity;
+
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Mapper
+public interface ScheduleJobLogDao extends BaseDao {
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/dto/ScheduleJobDTO.java b/bdty-admin/src/main/java/io/bdty/modules/job/dto/ScheduleJobDTO.java
new file mode 100644
index 0000000..a6ba981
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/dto/ScheduleJobDTO.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.bdty.common.validator.group.AddGroup;
+import io.bdty.common.validator.group.DefaultGroup;
+import io.bdty.common.validator.group.UpdateGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@ApiModel(value = "定时任务")
+public class ScheduleJobDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "id")
+ @Null(message="{id.null}", groups = AddGroup.class)
+ @NotNull(message="{id.require}", groups = UpdateGroup.class)
+ private Long id;
+
+ @ApiModelProperty(value = "spring bean名称")
+ @NotBlank(message = "{schedule.bean.require}", groups = DefaultGroup.class)
+ private String beanName;
+
+ @ApiModelProperty(value = "参数")
+ private String params;
+
+ @ApiModelProperty(value = "cron表达式")
+ @NotBlank(message = "{schedule.cron.require}", groups = DefaultGroup.class)
+ private String cronExpression;
+
+ @ApiModelProperty(value = "任务状态 0:暂停 1:正常")
+ @Range(min=0, max=1, message = "{schedule.status.range}", groups = DefaultGroup.class)
+ private Integer status;
+
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+ @ApiModelProperty(value = "创建时间")
+ @JsonProperty(access = JsonProperty.Access.READ_ONLY)
+ private Date createDate;
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/dto/ScheduleJobLogDTO.java b/bdty-admin/src/main/java/io/bdty/modules/job/dto/ScheduleJobLogDTO.java
new file mode 100644
index 0000000..8661abb
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/dto/ScheduleJobLogDTO.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@ApiModel(value = "定时任务日志")
+public class ScheduleJobLogDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "id")
+ private Long id;
+
+ @ApiModelProperty(value = "任务id")
+ private Long jobId;
+
+ @ApiModelProperty(value = "spring bean名称")
+ private String beanName;
+
+ @ApiModelProperty(value = "参数")
+ private String params;
+
+ @ApiModelProperty(value = "任务状态 0:失败 1:成功")
+ private Integer status;
+
+ @ApiModelProperty(value = "失败信息")
+ private String error;
+
+ @ApiModelProperty(value = "耗时(单位:毫秒)")
+ private Integer times;
+
+ @ApiModelProperty(value = "创建时间")
+ private Date createDate;
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/entity/ScheduleJobEntity.java b/bdty-admin/src/main/java/io/bdty/modules/job/entity/ScheduleJobEntity.java
new file mode 100644
index 0000000..0744c9e
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/entity/ScheduleJobEntity.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import io.bdty.common.entity.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("schedule_job")
+public class ScheduleJobEntity extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * spring bean名称
+ */
+ private String beanName;
+ /**
+ * 参数
+ */
+ private String params;
+ /**
+ * cron表达式
+ */
+ private String cronExpression;
+ /**
+ * 任务状态 0:暂停 1:正常
+ */
+ private Integer status;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 更新者
+ */
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Long updater;
+ /**
+ * 更新时间
+ */
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Date updateDate;
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/entity/ScheduleJobLogEntity.java b/bdty-admin/src/main/java/io/bdty/modules/job/entity/ScheduleJobLogEntity.java
new file mode 100644
index 0000000..24a453d
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/entity/ScheduleJobLogEntity.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Data
+@TableName("schedule_job_log")
+public class ScheduleJobLogEntity implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * id
+ */
+ @TableId
+ private Long id;
+ /**
+ * 任务id
+ */
+ private Long jobId;
+ /**
+ * spring bean名称
+ */
+ private String beanName;
+ /**
+ * 参数
+ */
+ private String params;
+ /**
+ * 任务状态 0:失败 1:成功
+ */
+ private Integer status;
+ /**
+ * 失败信息
+ */
+ private String error;
+ /**
+ * 耗时(单位:毫秒)
+ */
+ private Integer times;
+ /**
+ * 创建时间
+ */
+ private Date createDate;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/init/JobCommandLineRunner.java b/bdty-admin/src/main/java/io/bdty/modules/job/init/JobCommandLineRunner.java
new file mode 100644
index 0000000..82df3d3
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/init/JobCommandLineRunner.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.init;
+
+import lombok.AllArgsConstructor;
+import org.quartz.CronTrigger;
+import org.quartz.Scheduler;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import io.bdty.modules.job.dao.ScheduleJobDao;
+import io.bdty.modules.job.entity.ScheduleJobEntity;
+import io.bdty.modules.job.utils.ScheduleUtils;
+
+import java.util.List;
+
+/**
+ * 初始化定时任务数据
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Component
+@AllArgsConstructor
+public class JobCommandLineRunner implements CommandLineRunner {
+ private final Scheduler scheduler;
+ private final ScheduleJobDao scheduleJobDao;
+
+ @Override
+ public void run(String... args) {
+ List scheduleJobList = scheduleJobDao.selectList(null);
+ for (ScheduleJobEntity scheduleJob : scheduleJobList) {
+ CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getId());
+ //如果不存在,则创建
+ if (cronTrigger == null) {
+ ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
+ } else {
+ ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/service/ScheduleJobLogService.java b/bdty-admin/src/main/java/io/bdty/modules/job/service/ScheduleJobLogService.java
new file mode 100644
index 0000000..47f2391
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/service/ScheduleJobLogService.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.service;
+
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.BaseService;
+import io.bdty.modules.job.dto.ScheduleJobLogDTO;
+import io.bdty.modules.job.entity.ScheduleJobLogEntity;
+
+import java.util.Map;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface ScheduleJobLogService extends BaseService {
+
+ PageData page(Map params);
+
+ ScheduleJobLogDTO get(Long id);
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/service/ScheduleJobService.java b/bdty-admin/src/main/java/io/bdty/modules/job/service/ScheduleJobService.java
new file mode 100644
index 0000000..0fdbd12
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/service/ScheduleJobService.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.service;
+
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.BaseService;
+import io.bdty.modules.job.dto.ScheduleJobDTO;
+import io.bdty.modules.job.entity.ScheduleJobEntity;
+
+import java.util.Map;
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface ScheduleJobService extends BaseService {
+
+ PageData page(Map params);
+
+ ScheduleJobDTO get(Long id);
+
+ /**
+ * 保存定时任务
+ */
+ void save(ScheduleJobDTO dto);
+
+ /**
+ * 更新定时任务
+ */
+ void update(ScheduleJobDTO dto);
+
+ /**
+ * 批量删除定时任务
+ */
+ void deleteBatch(Long[] ids);
+
+ /**
+ * 批量更新定时任务状态
+ */
+ int updateBatch(Long[] ids, int status);
+
+ /**
+ * 立即执行
+ */
+ void run(Long[] ids);
+
+ /**
+ * 暂停运行
+ */
+ void pause(Long[] ids);
+
+ /**
+ * 恢复运行
+ */
+ void resume(Long[] ids);
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/service/impl/ScheduleJobLogServiceImpl.java b/bdty-admin/src/main/java/io/bdty/modules/job/service/impl/ScheduleJobLogServiceImpl.java
new file mode 100644
index 0000000..a7fcc82
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/service/impl/ScheduleJobLogServiceImpl.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.impl.BaseServiceImpl;
+import io.bdty.common.utils.ConvertUtils;
+import io.bdty.modules.job.dao.ScheduleJobLogDao;
+import io.bdty.modules.job.dto.ScheduleJobLogDTO;
+import io.bdty.modules.job.entity.ScheduleJobLogEntity;
+import io.bdty.modules.job.service.ScheduleJobLogService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Service
+public class ScheduleJobLogServiceImpl extends BaseServiceImpl implements ScheduleJobLogService {
+
+ @Override
+ public PageData page(Map params) {
+ IPage page = baseDao.selectPage(
+ getPage(params, Constant.CREATE_DATE, false),
+ getWrapper(params)
+ );
+ return getPageData(page, ScheduleJobLogDTO.class);
+ }
+
+ private QueryWrapper getWrapper(Map params){
+ String jobId = (String)params.get("jobId");
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(StrUtil.isNotBlank(jobId), "job_id", jobId);
+
+ return wrapper;
+ }
+
+ @Override
+ public ScheduleJobLogDTO get(Long id) {
+ ScheduleJobLogEntity entity = baseDao.selectById(id);
+
+ return ConvertUtils.sourceToTarget(entity, ScheduleJobLogDTO.class);
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/service/impl/ScheduleJobServiceImpl.java b/bdty-admin/src/main/java/io/bdty/modules/job/service/impl/ScheduleJobServiceImpl.java
new file mode 100644
index 0000000..8e268f1
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/service/impl/ScheduleJobServiceImpl.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.impl.BaseServiceImpl;
+import io.bdty.common.utils.ConvertUtils;
+import io.bdty.modules.job.dao.ScheduleJobDao;
+import io.bdty.modules.job.dto.ScheduleJobDTO;
+import io.bdty.modules.job.entity.ScheduleJobEntity;
+import io.bdty.modules.job.service.ScheduleJobService;
+import io.bdty.modules.job.utils.ScheduleUtils;
+import lombok.AllArgsConstructor;
+import org.quartz.Scheduler;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+@AllArgsConstructor
+public class ScheduleJobServiceImpl extends BaseServiceImpl implements ScheduleJobService {
+ private final Scheduler scheduler;
+
+ @Override
+ public PageData page(Map params) {
+ IPage page = baseDao.selectPage(
+ getPage(params, Constant.CREATE_DATE, false),
+ getWrapper(params)
+ );
+ return getPageData(page, ScheduleJobDTO.class);
+ }
+
+ @Override
+ public ScheduleJobDTO get(Long id) {
+ ScheduleJobEntity entity = baseDao.selectById(id);
+
+ return ConvertUtils.sourceToTarget(entity, ScheduleJobDTO.class);
+ }
+
+ private QueryWrapper getWrapper(Map params) {
+ String beanName = (String) params.get("beanName");
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.like(StrUtil.isNotBlank(beanName), "bean_name", beanName);
+
+ return wrapper;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void save(ScheduleJobDTO dto) {
+ ScheduleJobEntity entity = ConvertUtils.sourceToTarget(dto, ScheduleJobEntity.class);
+
+ entity.setStatus(Constant.ScheduleStatus.NORMAL.getValue());
+ this.insert(entity);
+
+ ScheduleUtils.createScheduleJob(scheduler, entity);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void update(ScheduleJobDTO dto) {
+ ScheduleJobEntity entity = ConvertUtils.sourceToTarget(dto, ScheduleJobEntity.class);
+
+ ScheduleUtils.updateScheduleJob(scheduler, entity);
+
+ this.updateById(entity);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteBatch(Long[] ids) {
+ for (Long id : ids) {
+ ScheduleUtils.deleteScheduleJob(scheduler, id);
+ }
+
+ //删除数据
+ this.deleteBatchIds(Arrays.asList(ids));
+ }
+
+ @Override
+ public int updateBatch(Long[] ids, int status) {
+ Map map = new HashMap<>(2);
+ map.put("ids", ids);
+ map.put("status", status);
+ return baseDao.updateBatch(map);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void run(Long[] ids) {
+ for (Long id : ids) {
+ ScheduleUtils.run(scheduler, this.selectById(id));
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void pause(Long[] ids) {
+ for (Long id : ids) {
+ ScheduleUtils.pauseJob(scheduler, id);
+ }
+
+ updateBatch(ids, Constant.ScheduleStatus.PAUSE.getValue());
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void resume(Long[] ids) {
+ for (Long id : ids) {
+ ScheduleUtils.resumeJob(scheduler, id);
+ }
+
+ updateBatch(ids, Constant.ScheduleStatus.NORMAL.getValue());
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/task/ITask.java b/bdty-admin/src/main/java/io/bdty/modules/job/task/ITask.java
new file mode 100644
index 0000000..68edcc9
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/task/ITask.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.task;
+
+/**
+ * 定时任务接口,所有定时任务都要实现该接口
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public interface ITask {
+
+ /**
+ * 执行定时任务接口
+ *
+ * @param params 参数,多参数使用JSON数据
+ */
+ void run(String params);
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/task/TestTask.java b/bdty-admin/src/main/java/io/bdty/modules/job/task/TestTask.java
new file mode 100644
index 0000000..1c1b800
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/task/TestTask.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.task;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 测试定时任务(演示Demo,可删除)
+ *
+ * testTask为spring bean的名称
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Component("testTask")
+public class TestTask implements ITask{
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ public void run(String params){
+ logger.debug("TestTask定时任务正在执行,参数为:{}", params);
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/utils/ScheduleJob.java b/bdty-admin/src/main/java/io/bdty/modules/job/utils/ScheduleJob.java
new file mode 100644
index 0000000..91478d1
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/utils/ScheduleJob.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.utils;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.exception.ExceptionUtils;
+import io.bdty.common.utils.SpringContextUtils;
+import io.bdty.modules.job.entity.ScheduleJobEntity;
+import io.bdty.modules.job.entity.ScheduleJobLogEntity;
+import io.bdty.modules.job.service.ScheduleJobLogService;
+
+import org.quartz.JobExecutionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import java.lang.reflect.Method;
+import java.util.Date;
+
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class ScheduleJob extends QuartzJobBean {
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ protected void executeInternal(JobExecutionContext context) {
+ ScheduleJobEntity scheduleJob = (ScheduleJobEntity) context.getMergedJobDataMap().
+ get(ScheduleUtils.JOB_PARAM_KEY);
+
+ //数据库保存执行记录
+ ScheduleJobLogEntity log = new ScheduleJobLogEntity();
+ log.setJobId(scheduleJob.getId());
+ log.setBeanName(scheduleJob.getBeanName());
+ log.setParams(scheduleJob.getParams());
+ log.setCreateDate(new Date());
+
+ //任务开始时间
+ long startTime = System.currentTimeMillis();
+
+ try {
+ //执行任务
+ logger.info("任务准备执行,任务ID:{}", scheduleJob.getId());
+ Object target = SpringContextUtils.getBean(scheduleJob.getBeanName());
+ Method method = target.getClass().getDeclaredMethod("run", String.class);
+ method.invoke(target, scheduleJob.getParams());
+
+ //任务执行总时长
+ long times = System.currentTimeMillis() - startTime;
+ log.setTimes((int)times);
+ //任务状态
+ log.setStatus(Constant.SUCCESS);
+
+ logger.info("任务执行完毕,任务ID:{} 总共耗时:{} 毫秒", scheduleJob.getId(), times);
+ } catch (Exception e) {
+ logger.error("任务执行失败,任务ID:{}", scheduleJob.getId(), e);
+
+ //任务执行总时长
+ long times = System.currentTimeMillis() - startTime;
+ log.setTimes((int)times);
+
+ //任务状态
+ log.setStatus(Constant.FAIL);
+ log.setError(ExceptionUtils.getErrorStackTrace(e));
+ }finally {
+ //获取spring bean
+ ScheduleJobLogService scheduleJobLogService = SpringContextUtils.getBean(ScheduleJobLogService.class);
+ scheduleJobLogService.insert(log);
+ }
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/job/utils/ScheduleUtils.java b/bdty-admin/src/main/java/io/bdty/modules/job/utils/ScheduleUtils.java
new file mode 100644
index 0000000..252b978
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/job/utils/ScheduleUtils.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.job.utils;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.exception.ErrorCode;
+import io.bdty.common.exception.RenException;
+import io.bdty.modules.job.entity.ScheduleJobEntity;
+
+import org.quartz.*;
+
+/**
+ * 定时任务工具类
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class ScheduleUtils {
+ private final static String JOB_NAME = "TASK_";
+ /**
+ * 任务调度参数key
+ */
+ public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY";
+
+ /**
+ * 获取触发器key
+ */
+ public static TriggerKey getTriggerKey(Long jobId) {
+ return TriggerKey.triggerKey(JOB_NAME + jobId);
+ }
+
+ /**
+ * 获取jobKey
+ */
+ public static JobKey getJobKey(Long jobId) {
+ return JobKey.jobKey(JOB_NAME + jobId);
+ }
+
+ /**
+ * 获取表达式触发器
+ */
+ public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
+ try {
+ return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
+ } catch (SchedulerException e) {
+ throw new RenException(ErrorCode.JOB_ERROR, e);
+ }
+ }
+
+ /**
+ * 创建定时任务
+ */
+ public static void createScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
+ try {
+ //构建job信息
+ JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getId())).build();
+
+ //表达式调度构建器
+ CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
+ .withMisfireHandlingInstructionDoNothing();
+
+ //按新的cronExpression表达式构建一个新的trigger
+ CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getId())).withSchedule(scheduleBuilder).build();
+
+ //放入参数,运行时的方法可以获取
+ jobDetail.getJobDataMap().put(JOB_PARAM_KEY, scheduleJob);
+
+ scheduler.scheduleJob(jobDetail, trigger);
+
+ //暂停任务
+ if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
+ pauseJob(scheduler, scheduleJob.getId());
+ }
+ } catch (SchedulerException e) {
+ throw new RenException(ErrorCode.JOB_ERROR, e);
+ }
+ }
+
+ /**
+ * 更新定时任务
+ */
+ public static void updateScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
+ try {
+ TriggerKey triggerKey = getTriggerKey(scheduleJob.getId());
+
+ //表达式调度构建器
+ CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
+ .withMisfireHandlingInstructionDoNothing();
+
+ CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getId());
+
+ //按新的cronExpression表达式重新构建trigger
+ trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
+
+ //参数
+ trigger.getJobDataMap().put(JOB_PARAM_KEY, scheduleJob);
+
+ scheduler.rescheduleJob(triggerKey, trigger);
+
+ //暂停任务
+ if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
+ pauseJob(scheduler, scheduleJob.getId());
+ }
+
+ } catch (SchedulerException e) {
+ throw new RenException(ErrorCode.JOB_ERROR, e);
+ }
+ }
+
+ /**
+ * 立即执行任务
+ */
+ public static void run(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
+ try {
+ //参数
+ JobDataMap dataMap = new JobDataMap();
+ dataMap.put(JOB_PARAM_KEY, scheduleJob);
+
+ scheduler.triggerJob(getJobKey(scheduleJob.getId()), dataMap);
+ } catch (SchedulerException e) {
+ throw new RenException(ErrorCode.JOB_ERROR, e);
+ }
+ }
+
+ /**
+ * 暂停任务
+ */
+ public static void pauseJob(Scheduler scheduler, Long jobId) {
+ try {
+ scheduler.pauseJob(getJobKey(jobId));
+ } catch (SchedulerException e) {
+ throw new RenException(ErrorCode.JOB_ERROR, e);
+ }
+ }
+
+ /**
+ * 恢复任务
+ */
+ public static void resumeJob(Scheduler scheduler, Long jobId) {
+ try {
+ scheduler.resumeJob(getJobKey(jobId));
+ } catch (SchedulerException e) {
+ throw new RenException(ErrorCode.JOB_ERROR, e);
+ }
+ }
+
+ /**
+ * 删除定时任务
+ */
+ public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
+ try {
+ scheduler.deleteJob(getJobKey(jobId));
+ } catch (SchedulerException e) {
+ throw new RenException(ErrorCode.JOB_ERROR, e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/controller/SysLogErrorController.java b/bdty-admin/src/main/java/io/bdty/modules/log/controller/SysLogErrorController.java
new file mode 100644
index 0000000..3f288af
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/controller/SysLogErrorController.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.controller;
+
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.ExcelUtils;
+import io.bdty.common.utils.Result;
+import io.bdty.modules.log.dto.SysLogErrorDTO;
+import io.bdty.modules.log.excel.SysLogErrorExcel;
+import io.bdty.modules.log.service.SysLogErrorService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 异常日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@RestController
+@RequestMapping("sys/log/error")
+@Api(tags = "异常日志")
+@AllArgsConstructor
+public class SysLogErrorController {
+ private final SysLogErrorService sysLogErrorService;
+
+ @GetMapping("page")
+ @ApiOperation("分页")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType = "String"),
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType = "String")
+ })
+ @RequiresPermissions("sys:log:error")
+ public Result> page(@ApiIgnore @RequestParam Map params) {
+ PageData page = sysLogErrorService.page(params);
+
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("export")
+ @ApiOperation("导出")
+ @LogOperation("导出")
+ @RequiresPermissions("sys:log:error")
+ public void export(@ApiIgnore @RequestParam Map params, HttpServletResponse response) throws Exception {
+ List list = sysLogErrorService.list(params);
+
+ ExcelUtils.exportExcelToTarget(response, null, "异常日志", list, SysLogErrorExcel.class);
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/controller/SysLogLoginController.java b/bdty-admin/src/main/java/io/bdty/modules/log/controller/SysLogLoginController.java
new file mode 100644
index 0000000..5959b5d
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/controller/SysLogLoginController.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.controller;
+
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.ExcelUtils;
+import io.bdty.common.utils.Result;
+import io.bdty.modules.log.dto.SysLogLoginDTO;
+import io.bdty.modules.log.excel.SysLogLoginExcel;
+import io.bdty.modules.log.service.SysLogLoginService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 登录日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@RestController
+@RequestMapping("sys/log/login")
+@Api(tags = "登录日志")
+@AllArgsConstructor
+public class SysLogLoginController {
+ private final SysLogLoginService sysLogLoginService;
+
+ @GetMapping("page")
+ @ApiOperation("分页")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType = "String"),
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType = "String"),
+ @ApiImplicitParam(name = "status", value = "状态 0:失败 1:成功 2:账号已锁定", paramType = "query", dataType = "int"),
+ @ApiImplicitParam(name = "creatorName", value = "用户名", paramType = "query", dataType = "String")
+ })
+ @RequiresPermissions("sys:log:login")
+ public Result> page(@ApiIgnore @RequestParam Map params) {
+ PageData page = sysLogLoginService.page(params);
+
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("export")
+ @ApiOperation("导出")
+ @LogOperation("导出")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "status", value = "状态 0:失败 1:成功 2:账号已锁定", paramType = "query", dataType = "int"),
+ @ApiImplicitParam(name = "creatorName", value = "用户名", paramType = "query", dataType = "String")
+ })
+ @RequiresPermissions("sys:log:login")
+ public void export(@ApiIgnore @RequestParam Map params, HttpServletResponse response) throws Exception {
+ List list = sysLogLoginService.list(params);
+
+ ExcelUtils.exportExcelToTarget(response, null, "登录日志", list, SysLogLoginExcel.class);
+
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/controller/SysLogOperationController.java b/bdty-admin/src/main/java/io/bdty/modules/log/controller/SysLogOperationController.java
new file mode 100644
index 0000000..6ab4f06
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/controller/SysLogOperationController.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.controller;
+
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.ExcelUtils;
+import io.bdty.common.utils.Result;
+import io.bdty.modules.log.dto.SysLogOperationDTO;
+import io.bdty.modules.log.excel.SysLogOperationExcel;
+import io.bdty.modules.log.service.SysLogOperationService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 操作日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@RestController
+@RequestMapping("sys/log/operation")
+@Api(tags = "操作日志")
+@AllArgsConstructor
+public class SysLogOperationController {
+ private final SysLogOperationService sysLogOperationService;
+
+ @GetMapping("page")
+ @ApiOperation("分页")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = Constant.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"),
+ @ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType = "String"),
+ @ApiImplicitParam(name = Constant.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType = "String"),
+ @ApiImplicitParam(name = "status", value = "状态 0:失败 1:成功", paramType = "query", dataType = "int")
+ })
+ @RequiresPermissions("sys:log:operation")
+ public Result> page(@ApiIgnore @RequestParam Map params) {
+ PageData page = sysLogOperationService.page(params);
+
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("export")
+ @ApiOperation("导出")
+ @LogOperation("导出")
+ @RequiresPermissions("sys:log:operation")
+ public void export(@ApiIgnore @RequestParam Map params, HttpServletResponse response) throws Exception {
+ List list = sysLogOperationService.list(params);
+
+ ExcelUtils.exportExcelToTarget(response, null, "操作日志", list, SysLogOperationExcel.class);
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/dao/SysLogErrorDao.java b/bdty-admin/src/main/java/io/bdty/modules/log/dao/SysLogErrorDao.java
new file mode 100644
index 0000000..addb17d
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/dao/SysLogErrorDao.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.dao;
+
+import io.bdty.common.dao.BaseDao;
+import io.bdty.modules.log.entity.SysLogErrorEntity;
+
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 异常日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Mapper
+public interface SysLogErrorDao extends BaseDao {
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/dao/SysLogLoginDao.java b/bdty-admin/src/main/java/io/bdty/modules/log/dao/SysLogLoginDao.java
new file mode 100644
index 0000000..9da03b5
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/dao/SysLogLoginDao.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.dao;
+
+import io.bdty.common.dao.BaseDao;
+import io.bdty.modules.log.entity.SysLogLoginEntity;
+
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 登录日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Mapper
+public interface SysLogLoginDao extends BaseDao {
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/dao/SysLogOperationDao.java b/bdty-admin/src/main/java/io/bdty/modules/log/dao/SysLogOperationDao.java
new file mode 100644
index 0000000..517f9f7
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/dao/SysLogOperationDao.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.dao;
+
+import io.bdty.common.dao.BaseDao;
+import io.bdty.modules.log.entity.SysLogOperationEntity;
+
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 操作日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Mapper
+public interface SysLogOperationDao extends BaseDao {
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/dto/SysLogErrorDTO.java b/bdty-admin/src/main/java/io/bdty/modules/log/dto/SysLogErrorDTO.java
new file mode 100644
index 0000000..a6a2916
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/dto/SysLogErrorDTO.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 异常日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@ApiModel(value = "异常日志")
+public class SysLogErrorDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "id")
+ private Long id;
+ @ApiModelProperty(value = "请求URI")
+ private String requestUri;
+ @ApiModelProperty(value = "请求方式")
+ private String requestMethod;
+ @ApiModelProperty(value = "请求参数")
+ private String requestParams;
+ @ApiModelProperty(value = "用户代理")
+ private String userAgent;
+ @ApiModelProperty(value = "操作IP")
+ private String ip;
+ @ApiModelProperty(value = "异常信息")
+ private String errorInfo;
+ @ApiModelProperty(value = "创建时间")
+ private Date createDate;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/dto/SysLogLoginDTO.java b/bdty-admin/src/main/java/io/bdty/modules/log/dto/SysLogLoginDTO.java
new file mode 100644
index 0000000..e6eefd1
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/dto/SysLogLoginDTO.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 登录日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@ApiModel(value = "登录日志")
+public class SysLogLoginDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "id")
+ private Long id;
+
+ @ApiModelProperty(value = "用户操作 0:用户登录 1:用户退出")
+ private Integer operation;
+
+ @ApiModelProperty(value = "状态 0:失败 1:成功 2:账号已锁定")
+ private Integer status;
+
+ @ApiModelProperty(value = "用户代理")
+ private String userAgent;
+
+ @ApiModelProperty(value = "操作IP")
+ private String ip;
+
+ @ApiModelProperty(value = "用户名")
+ private String creatorName;
+
+ @ApiModelProperty(value = "创建时间")
+ private Date createDate;
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/dto/SysLogOperationDTO.java b/bdty-admin/src/main/java/io/bdty/modules/log/dto/SysLogOperationDTO.java
new file mode 100644
index 0000000..b091c3a
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/dto/SysLogOperationDTO.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 操作日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@ApiModel(value = "操作日志")
+public class SysLogOperationDTO implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "id")
+ private Long id;
+
+ @ApiModelProperty(value = "用户操作")
+ private String operation;
+
+ @ApiModelProperty(value = "请求URI")
+ private String requestUri;
+
+ @ApiModelProperty(value = "请求方式")
+ private String requestMethod;
+
+ @ApiModelProperty(value = "请求参数")
+ private String requestParams;
+
+ @ApiModelProperty(value = "请求时长(毫秒)")
+ private Integer requestTime;
+
+ @ApiModelProperty(value = "用户代理")
+ private String userAgent;
+
+ @ApiModelProperty(value = "操作IP")
+ private String ip;
+
+ @ApiModelProperty(value = "状态 0:失败 1:成功")
+ private Integer status;
+
+ @ApiModelProperty(value = "用户名")
+ private String creatorName;
+
+ @ApiModelProperty(value = "创建时间")
+ private Date createDate;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/entity/SysLogErrorEntity.java b/bdty-admin/src/main/java/io/bdty/modules/log/entity/SysLogErrorEntity.java
new file mode 100644
index 0000000..2bf1ea6
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/entity/SysLogErrorEntity.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import io.bdty.common.entity.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 异常日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("sys_log_error")
+public class SysLogErrorEntity extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 请求URI
+ */
+ private String requestUri;
+ /**
+ * 请求方式
+ */
+ private String requestMethod;
+ /**
+ * 请求参数
+ */
+ private String requestParams;
+ /**
+ * 用户代理
+ */
+ private String userAgent;
+ /**
+ * 操作IP
+ */
+ private String ip;
+ /**
+ * 异常信息
+ */
+ private String errorInfo;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/entity/SysLogLoginEntity.java b/bdty-admin/src/main/java/io/bdty/modules/log/entity/SysLogLoginEntity.java
new file mode 100644
index 0000000..52cb6ae
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/entity/SysLogLoginEntity.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import io.bdty.common.entity.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 登录日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("sys_log_login")
+public class SysLogLoginEntity extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 用户操作 0:用户登录 1:用户退出
+ */
+ private Integer operation;
+ /**
+ * 状态 0:失败 1:成功 2:账号已锁定
+ */
+ private Integer status;
+ /**
+ * 用户代理
+ */
+ private String userAgent;
+ /**
+ * 操作IP
+ */
+ private String ip;
+ /**
+ * 用户名
+ */
+ private String creatorName;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/entity/SysLogOperationEntity.java b/bdty-admin/src/main/java/io/bdty/modules/log/entity/SysLogOperationEntity.java
new file mode 100644
index 0000000..a4ab745
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/entity/SysLogOperationEntity.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import io.bdty.common.entity.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 操作日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("sys_log_operation")
+public class SysLogOperationEntity extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 用户操作
+ */
+ private String operation;
+ /**
+ * 请求URI
+ */
+ private String requestUri;
+ /**
+ * 请求方式
+ */
+ private String requestMethod;
+ /**
+ * 请求参数
+ */
+ private String requestParams;
+ /**
+ * 请求时长(毫秒)
+ */
+ private Integer requestTime;
+ /**
+ * 用户代理
+ */
+ private String userAgent;
+ /**
+ * 操作IP
+ */
+ private String ip;
+ /**
+ * 状态 0:失败 1:成功
+ */
+ private Integer status;
+ /**
+ * 用户名
+ */
+ private String creatorName;
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/enums/LoginOperationEnum.java b/bdty-admin/src/main/java/io/bdty/modules/log/enums/LoginOperationEnum.java
new file mode 100644
index 0000000..5bcf559
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/enums/LoginOperationEnum.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.enums;
+
+/**
+ * 登录操作枚举
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public enum LoginOperationEnum {
+ /**
+ * 用户登录
+ */
+ LOGIN(0),
+ /**
+ * 用户退出
+ */
+ LOGOUT(1);
+
+ private int value;
+
+ LoginOperationEnum(int value) {
+ this.value = value;
+ }
+
+ public int value() {
+ return this.value;
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/enums/LoginStatusEnum.java b/bdty-admin/src/main/java/io/bdty/modules/log/enums/LoginStatusEnum.java
new file mode 100644
index 0000000..6444347
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/enums/LoginStatusEnum.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.enums;
+
+/**
+ * 登录状态枚举
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public enum LoginStatusEnum {
+ /**
+ * 失败
+ */
+ FAIL(0),
+ /**
+ * 成功
+ */
+ SUCCESS(1),
+ /**
+ * 账号已锁定
+ */
+ LOCK(2);
+
+ private int value;
+
+ LoginStatusEnum(int value) {
+ this.value = value;
+ }
+
+ public int value() {
+ return this.value;
+ }
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/enums/OperationStatusEnum.java b/bdty-admin/src/main/java/io/bdty/modules/log/enums/OperationStatusEnum.java
new file mode 100644
index 0000000..3e71381
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/enums/OperationStatusEnum.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.enums;
+
+/**
+ * 操作状态枚举
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public enum OperationStatusEnum {
+ /**
+ * 失败
+ */
+ FAIL(0),
+ /**
+ * 成功
+ */
+ SUCCESS(1);
+
+ private int value;
+
+ OperationStatusEnum(int value) {
+ this.value = value;
+ }
+
+ public int value() {
+ return this.value;
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/excel/SysLogErrorExcel.java b/bdty-admin/src/main/java/io/bdty/modules/log/excel/SysLogErrorExcel.java
new file mode 100644
index 0000000..8f24bf8
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/excel/SysLogErrorExcel.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.DateTimeFormat;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 异常日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Data
+@ContentRowHeight(20)
+@HeadRowHeight(20)
+@ColumnWidth(25)
+public class SysLogErrorExcel {
+ @ExcelProperty("请求URI")
+ private String requestUri;
+
+ @ExcelProperty("请求方式")
+ private String requestMethod;
+
+ @ExcelProperty("请求参数")
+ private String requestParams;
+
+ @ExcelProperty("User-Agent")
+ private String userAgent;
+
+ @ExcelProperty("操作IP")
+ private String ip;
+
+ @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
+ @ExcelProperty("创建时间")
+ private Date createDate;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/excel/SysLogLoginExcel.java b/bdty-admin/src/main/java/io/bdty/modules/log/excel/SysLogLoginExcel.java
new file mode 100644
index 0000000..88817f8
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/excel/SysLogLoginExcel.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.DateTimeFormat;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+
+import io.bdty.modules.log.excel.converter.SysLogOperationConverter;
+import io.bdty.modules.log.excel.converter.SysLogStatusConverter;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 登录日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Data
+@ContentRowHeight(20)
+@HeadRowHeight(20)
+@ColumnWidth(25)
+public class SysLogLoginExcel {
+ @ExcelProperty(value = "操作类型", converter = SysLogOperationConverter.class)
+ private Integer operation;
+
+ @ExcelProperty(value = "状态", converter = SysLogStatusConverter.class)
+ private Integer status;
+
+ @ExcelProperty("User-Agent")
+ private String userAgent;
+
+ @ExcelProperty("操作IP")
+ private String ip;
+
+ @ExcelProperty("用户名")
+ private String creatorName;
+
+ @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
+ @ExcelProperty("创建时间")
+ private Date createDate;
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/excel/SysLogOperationExcel.java b/bdty-admin/src/main/java/io/bdty/modules/log/excel/SysLogOperationExcel.java
new file mode 100644
index 0000000..0ed5d97
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/excel/SysLogOperationExcel.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.DateTimeFormat;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 操作日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Data
+@ContentRowHeight(20)
+@HeadRowHeight(20)
+@ColumnWidth(25)
+public class SysLogOperationExcel {
+ @ExcelProperty("用户操作")
+ private String operation;
+
+ @ExcelProperty("请求URI")
+ private String requestUri;
+
+ @ExcelProperty("请求方式")
+ private String requestMethod;
+
+ @ExcelProperty("请求参数")
+ private String requestParams;
+
+ @ExcelProperty("请求时长(毫秒)")
+ private Integer requestTime;
+
+ @ExcelProperty("User-Agent")
+ private String userAgent;
+
+ @ExcelProperty("操作IP")
+ private String ip;
+
+ @ExcelProperty("状态")
+ private Integer status;
+
+ @ExcelProperty("用户名")
+ private String creatorName;
+
+ @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
+ @ExcelProperty("创建时间")
+ private Date createDate;
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/excel/converter/SysLogOperationConverter.java b/bdty-admin/src/main/java/io/bdty/modules/log/excel/converter/SysLogOperationConverter.java
new file mode 100644
index 0000000..a0be5ad
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/excel/converter/SysLogOperationConverter.java
@@ -0,0 +1,40 @@
+package io.bdty.modules.log.excel.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+public class SysLogOperationConverter implements Converter {
+
+ @Override
+ public Class supportJavaTypeKey() {
+ return Integer.class;
+ }
+
+ @Override
+ public CellDataTypeEnum supportExcelTypeKey() {
+ return CellDataTypeEnum.STRING;
+ }
+
+ @Override
+ public Integer convertToJavaData(ReadCellData> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+ if(cellData.getStringValue().equals("用户登录")){
+ return 0;
+ }else{
+ return 1;
+ }
+ }
+
+ @Override
+ public WriteCellData> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+ if(value == 0){
+ return new WriteCellData<>("用户登录");
+ }else{
+ return new WriteCellData<>("用户退出");
+ }
+ }
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/excel/converter/SysLogStatusConverter.java b/bdty-admin/src/main/java/io/bdty/modules/log/excel/converter/SysLogStatusConverter.java
new file mode 100644
index 0000000..02e723d
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/excel/converter/SysLogStatusConverter.java
@@ -0,0 +1,48 @@
+package io.bdty.modules.log.excel.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+public class SysLogStatusConverter implements Converter {
+
+ @Override
+ public Class supportJavaTypeKey() {
+ return Integer.class;
+ }
+
+ @Override
+ public CellDataTypeEnum supportExcelTypeKey() {
+ return CellDataTypeEnum.STRING;
+ }
+
+ @Override
+ public Integer convertToJavaData(ReadCellData> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+ if(cellData.getStringValue().equals("失败")){
+ return 0;
+ }else if(cellData.getStringValue().equals("成功")){
+ return 1;
+ }else if(cellData.getStringValue().equals("账号已锁定")){
+ return 2;
+ }else{
+ return -1;
+ }
+ }
+
+ @Override
+ public WriteCellData> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+ if(value == 0){
+ return new WriteCellData<>("失败");
+ }else if(value == 1){
+ return new WriteCellData<>("成功");
+ }else if(value == 2){
+ return new WriteCellData<>("账号已锁定");
+ }else{
+ return new WriteCellData<>("未知");
+ }
+ }
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/service/SysLogErrorService.java b/bdty-admin/src/main/java/io/bdty/modules/log/service/SysLogErrorService.java
new file mode 100644
index 0000000..9e17349
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/service/SysLogErrorService.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.service;
+
+
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.BaseService;
+import io.bdty.modules.log.dto.SysLogErrorDTO;
+import io.bdty.modules.log.entity.SysLogErrorEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 异常日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public interface SysLogErrorService extends BaseService {
+
+ PageData page(Map params);
+
+ List list(Map params);
+
+ void save(SysLogErrorEntity entity);
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/service/SysLogLoginService.java b/bdty-admin/src/main/java/io/bdty/modules/log/service/SysLogLoginService.java
new file mode 100644
index 0000000..8518d65
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/service/SysLogLoginService.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.service;
+
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.BaseService;
+import io.bdty.modules.log.dto.SysLogLoginDTO;
+import io.bdty.modules.log.entity.SysLogLoginEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 登录日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public interface SysLogLoginService extends BaseService {
+
+ PageData page(Map params);
+
+ List list(Map params);
+
+ void save(SysLogLoginEntity entity);
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/service/SysLogOperationService.java b/bdty-admin/src/main/java/io/bdty/modules/log/service/SysLogOperationService.java
new file mode 100644
index 0000000..55ad51a
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/service/SysLogOperationService.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.service;
+
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.BaseService;
+import io.bdty.modules.log.dto.SysLogOperationDTO;
+import io.bdty.modules.log.entity.SysLogOperationEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 操作日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public interface SysLogOperationService extends BaseService {
+
+ PageData page(Map params);
+
+ List list(Map params);
+
+ void save(SysLogOperationEntity entity);
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/service/impl/SysLogErrorServiceImpl.java b/bdty-admin/src/main/java/io/bdty/modules/log/service/impl/SysLogErrorServiceImpl.java
new file mode 100644
index 0000000..0a04cc9
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/service/impl/SysLogErrorServiceImpl.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.impl.BaseServiceImpl;
+import io.bdty.common.utils.ConvertUtils;
+import io.bdty.modules.log.dao.SysLogErrorDao;
+import io.bdty.modules.log.dto.SysLogErrorDTO;
+import io.bdty.modules.log.entity.SysLogErrorEntity;
+import io.bdty.modules.log.service.SysLogErrorService;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 异常日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Service
+public class SysLogErrorServiceImpl extends BaseServiceImpl implements SysLogErrorService {
+
+ @Override
+ public PageData page(Map params) {
+ IPage page = baseDao.selectPage(
+ getPage(params, Constant.CREATE_DATE, false),
+ getWrapper(params)
+ );
+
+ return getPageData(page, SysLogErrorDTO.class);
+ }
+
+ @Override
+ public List list(Map params) {
+ List entityList = baseDao.selectList(getWrapper(params));
+
+ return ConvertUtils.sourceToTarget(entityList, SysLogErrorDTO.class);
+ }
+
+ private QueryWrapper getWrapper(Map params){
+ QueryWrapper wrapper = new QueryWrapper<>();
+ return wrapper;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void save(SysLogErrorEntity entity) {
+ insert(entity);
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/service/impl/SysLogLoginServiceImpl.java b/bdty-admin/src/main/java/io/bdty/modules/log/service/impl/SysLogLoginServiceImpl.java
new file mode 100644
index 0000000..2f3a7cf
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/service/impl/SysLogLoginServiceImpl.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.impl.BaseServiceImpl;
+import io.bdty.common.utils.ConvertUtils;
+import io.bdty.modules.log.dao.SysLogLoginDao;
+import io.bdty.modules.log.dto.SysLogLoginDTO;
+import io.bdty.modules.log.entity.SysLogLoginEntity;
+import io.bdty.modules.log.service.SysLogLoginService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 登录日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Service
+public class SysLogLoginServiceImpl extends BaseServiceImpl implements SysLogLoginService {
+
+ @Override
+ public PageData page(Map params) {
+ IPage page = baseDao.selectPage(
+ getPage(params, Constant.CREATE_DATE, false),
+ getWrapper(params)
+ );
+
+ return getPageData(page, SysLogLoginDTO.class);
+ }
+
+ @Override
+ public List list(Map params) {
+ List entityList = baseDao.selectList(getWrapper(params));
+
+ return ConvertUtils.sourceToTarget(entityList, SysLogLoginDTO.class);
+ }
+
+ private QueryWrapper getWrapper(Map params){
+ String status = (String) params.get("status");
+ String creatorName = (String) params.get("creatorName");
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(StrUtil.isNotBlank(status), "status", status);
+ wrapper.like(StrUtil.isNotBlank(creatorName), "creator_name", creatorName);
+
+ return wrapper;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void save(SysLogLoginEntity entity) {
+ insert(entity);
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/log/service/impl/SysLogOperationServiceImpl.java b/bdty-admin/src/main/java/io/bdty/modules/log/service/impl/SysLogOperationServiceImpl.java
new file mode 100644
index 0000000..67487ce
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/log/service/impl/SysLogOperationServiceImpl.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.log.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.page.PageData;
+import io.bdty.common.service.impl.BaseServiceImpl;
+import io.bdty.common.utils.ConvertUtils;
+import io.bdty.modules.log.dao.SysLogOperationDao;
+import io.bdty.modules.log.dto.SysLogOperationDTO;
+import io.bdty.modules.log.entity.SysLogOperationEntity;
+import io.bdty.modules.log.service.SysLogOperationService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 操作日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Service
+public class SysLogOperationServiceImpl extends BaseServiceImpl implements SysLogOperationService {
+
+ @Override
+ public PageData page(Map params) {
+ IPage page = baseDao.selectPage(
+ getPage(params, Constant.CREATE_DATE, false),
+ getWrapper(params)
+ );
+
+ return getPageData(page, SysLogOperationDTO.class);
+ }
+
+ @Override
+ public List list(Map params) {
+ List entityList = baseDao.selectList(getWrapper(params));
+
+ return ConvertUtils.sourceToTarget(entityList, SysLogOperationDTO.class);
+ }
+
+ private QueryWrapper getWrapper(Map params){
+ String status = (String) params.get("status");
+
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(StrUtil.isNotBlank(status), "status", status);
+
+ return wrapper;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void save(SysLogOperationEntity entity) {
+ insert(entity);
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/AbstractCloudStorageService.java b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/AbstractCloudStorageService.java
new file mode 100644
index 0000000..8b82509
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/AbstractCloudStorageService.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.oss.cloud;
+
+import cn.hutool.core.util.StrUtil;
+import io.bdty.common.utils.DateUtils;
+
+import java.io.InputStream;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 云存储(支持七牛、阿里云、腾讯云)
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public abstract class AbstractCloudStorageService {
+ /** 云存储配置信息 */
+ CloudStorageConfig config;
+
+ /**
+ * 文件路径
+ * @param prefix 前缀
+ * @param suffix 后缀
+ * @return 返回上传路径
+ */
+ public String getPath(String prefix, String suffix) {
+ //生成uuid
+ String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+ //文件路径
+ String path = DateUtils.format(new Date(), "yyyyMMdd") + "/" + uuid;
+
+ if(StrUtil.isNotBlank(prefix)){
+ path = prefix + "/" + path;
+ }
+
+ return path + "." + suffix;
+ }
+
+ /**
+ * 文件上传
+ * @param data 文件字节数组
+ * @param path 文件路径,包含文件名
+ * @return 返回http地址
+ */
+ public abstract String upload(byte[] data, String path);
+
+ /**
+ * 文件上传
+ * @param data 文件字节数组
+ * @param suffix 后缀
+ * @return 返回http地址
+ */
+ public abstract String uploadSuffix(byte[] data, String suffix);
+
+ /**
+ * 文件上传
+ * @param inputStream 字节流
+ * @param path 文件路径,包含文件名
+ * @return 返回http地址
+ */
+ public abstract String upload(InputStream inputStream, String path);
+
+ /**
+ * 文件上传
+ * @param inputStream 字节流
+ * @param suffix 后缀
+ * @return 返回http地址
+ */
+ public abstract String uploadSuffix(InputStream inputStream, String suffix);
+
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/AliyunCloudStorageService.java b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/AliyunCloudStorageService.java
new file mode 100644
index 0000000..fbeb3ef
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/AliyunCloudStorageService.java
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.oss.cloud;
+
+import com.aliyun.oss.OSSClient;
+
+import io.bdty.common.exception.ErrorCode;
+import io.bdty.common.exception.RenException;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+/**
+ * 阿里云存储
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class AliyunCloudStorageService extends AbstractCloudStorageService {
+
+ public AliyunCloudStorageService(CloudStorageConfig config){
+ this.config = config;
+ }
+
+ @Override
+ public String upload(byte[] data, String path) {
+ return upload(new ByteArrayInputStream(data), path);
+ }
+
+ @Override
+ public String upload(InputStream inputStream, String path) {
+ OSSClient client = new OSSClient(config.getAliyunEndPoint(), config.getAliyunAccessKeyId(),
+ config.getAliyunAccessKeySecret());
+ try {
+ client.putObject(config.getAliyunBucketName(), path, inputStream);
+ client.shutdown();
+ } catch (Exception e){
+ throw new RenException(ErrorCode.OSS_UPLOAD_FILE_ERROR, e, "");
+ }
+
+ return config.getAliyunDomain() + "/" + path;
+ }
+
+ @Override
+ public String uploadSuffix(byte[] data, String suffix) {
+ return upload(data, getPath(config.getAliyunPrefix(), suffix));
+ }
+
+ @Override
+ public String uploadSuffix(InputStream inputStream, String suffix) {
+ return upload(inputStream, getPath(config.getAliyunPrefix(), suffix));
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/CloudStorageConfig.java b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/CloudStorageConfig.java
new file mode 100644
index 0000000..2db41cf
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/CloudStorageConfig.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.oss.cloud;
+
+import io.bdty.common.validator.group.AliyunGroup;
+import io.bdty.common.validator.group.QcloudGroup;
+import io.bdty.common.validator.group.QiniuGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+import org.hibernate.validator.constraints.URL;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 云存储配置信息
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Data
+@ApiModel(value = "云存储配置信息")
+public class CloudStorageConfig implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "类型 1:七牛 2:阿里云 3:腾讯云 ")
+ @Range(min = 1, max = 6, message = "{oss.type.range}")
+ private Integer type;
+
+ @ApiModelProperty(value = "七牛绑定的域名")
+ @NotBlank(message = "{qiniu.domain.require}", groups = QiniuGroup.class)
+ @URL(message = "{qiniu.domain.url}", groups = QiniuGroup.class)
+ private String qiniuDomain;
+
+ @ApiModelProperty(value = "七牛路径前缀")
+ private String qiniuPrefix;
+
+ @ApiModelProperty(value = "七牛ACCESS_KEY")
+ @NotBlank(message = "{qiniu.accesskey.require}", groups = QiniuGroup.class)
+ private String qiniuAccessKey;
+
+ @ApiModelProperty(value = "七牛SECRET_KEY")
+ @NotBlank(message = "{qiniu.secretkey.require}", groups = QiniuGroup.class)
+ private String qiniuSecretKey;
+
+ @ApiModelProperty(value = "七牛存储空间名")
+ @NotBlank(message = "{qiniu.bucketname.require}", groups = QiniuGroup.class)
+ private String qiniuBucketName;
+
+ @ApiModelProperty(value = "阿里云绑定的域名")
+ @NotBlank(message = "{aliyun.domain.require}", groups = AliyunGroup.class)
+ @URL(message = "{aliyun.domain.url}", groups = AliyunGroup.class)
+ private String aliyunDomain;
+
+ @ApiModelProperty(value = "阿里云路径前缀")
+ private String aliyunPrefix;
+
+ @ApiModelProperty(value = "阿里云EndPoint")
+ @NotBlank(message = "{aliyun.endPoint.require}", groups = AliyunGroup.class)
+ private String aliyunEndPoint;
+
+ @ApiModelProperty(value = "阿里云AccessKeyId")
+ @NotBlank(message = "{aliyun.accesskeyid.require}", groups = AliyunGroup.class)
+ private String aliyunAccessKeyId;
+
+ @ApiModelProperty(value = "阿里云AccessKeySecret")
+ @NotBlank(message = "{aliyun.accesskeysecret.require}", groups = AliyunGroup.class)
+ private String aliyunAccessKeySecret;
+
+ @ApiModelProperty(value = "阿里云BucketName")
+ @NotBlank(message = "{aliyun.bucketname.require}", groups = AliyunGroup.class)
+ private String aliyunBucketName;
+
+ @ApiModelProperty(value = "腾讯云绑定的域名")
+ @NotBlank(message = "{qcloud.domain.require}", groups = QcloudGroup.class)
+ @URL(message = "{qcloud.domain.url}", groups = QcloudGroup.class)
+ private String qcloudDomain;
+
+ @ApiModelProperty(value = "腾讯云路径前缀")
+ private String qcloudPrefix;
+
+ @ApiModelProperty(value = "腾讯云AppId")
+ @NotNull(message = "{qcloud.appid.require}", groups = QcloudGroup.class)
+ private Integer qcloudAppId;
+
+ @ApiModelProperty(value = "腾讯云SecretId")
+ @NotBlank(message = "{qcloud.secretId.require}", groups = QcloudGroup.class)
+ private String qcloudSecretId;
+
+ @ApiModelProperty(value = "腾讯云SecretKey")
+ @NotBlank(message = "{qcloud.secretkey.require}", groups = QcloudGroup.class)
+ private String qcloudSecretKey;
+
+ @ApiModelProperty(value = "腾讯云BucketName")
+ @NotBlank(message = "{qcloud.bucketname.require}", groups = QcloudGroup.class)
+ private String qcloudBucketName;
+
+ @ApiModelProperty(value = "腾讯云COS所属地区")
+ @NotBlank(message = "{qcloud.region.require}", groups = QcloudGroup.class)
+ private String qcloudRegion;
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/OSSFactory.java b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/OSSFactory.java
new file mode 100644
index 0000000..f022495
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/OSSFactory.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.oss.cloud;
+
+import io.bdty.common.constant.Constant;
+import io.bdty.common.utils.SpringContextUtils;
+import io.bdty.modules.sys.service.SysParamsService;
+
+/**
+ * 文件上传Factory
+ * @author Mark sunlightcs@gmail.com
+ */
+public final class OSSFactory {
+ private static SysParamsService sysParamsService;
+
+ static {
+ OSSFactory.sysParamsService = SpringContextUtils.getBean(SysParamsService.class);
+ }
+
+ public static AbstractCloudStorageService build(){
+ //获取云存储配置信息
+ CloudStorageConfig config = sysParamsService.getValueObject(Constant.CLOUD_STORAGE_CONFIG_KEY, CloudStorageConfig.class);
+
+ if(config.getType() == Constant.CloudService.QINIU.getValue()){
+ return new QiniuCloudStorageService(config);
+ }else if(config.getType() == Constant.CloudService.ALIYUN.getValue()){
+ return new AliyunCloudStorageService(config);
+ }else if(config.getType() == Constant.CloudService.QCLOUD.getValue()){
+ return new QcloudCloudStorageService(config);
+ }
+
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/QcloudCloudStorageService.java b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/QcloudCloudStorageService.java
new file mode 100644
index 0000000..65516af
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/QcloudCloudStorageService.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.oss.cloud;
+
+import com.qcloud.cos.COSClient;
+import com.qcloud.cos.ClientConfig;
+import com.qcloud.cos.auth.BasicCOSCredentials;
+import com.qcloud.cos.auth.COSCredentials;
+import com.qcloud.cos.model.ObjectMetadata;
+import com.qcloud.cos.model.PutObjectRequest;
+import com.qcloud.cos.model.PutObjectResult;
+import com.qcloud.cos.region.Region;
+
+import io.bdty.common.exception.ErrorCode;
+import io.bdty.common.exception.RenException;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * 腾讯云存储
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class QcloudCloudStorageService extends AbstractCloudStorageService {
+ private COSCredentials credentials;
+ private ClientConfig clientConfig;
+
+ public QcloudCloudStorageService(CloudStorageConfig config){
+ this.config = config;
+
+ //初始化
+ init();
+ }
+
+ private void init(){
+ //1、初始化用户身份信息(secretId, secretKey)
+ credentials = new BasicCOSCredentials(config.getQcloudSecretId(), config.getQcloudSecretKey());
+
+ //2、设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
+ clientConfig = new ClientConfig(new Region(config.getQcloudRegion()));
+ }
+
+ @Override
+ public String upload(byte[] data, String path) {
+ return upload(new ByteArrayInputStream(data), path);
+ }
+
+ @Override
+ public String upload(InputStream inputStream, String path) {
+ try {
+ COSClient client = new COSClient(credentials, clientConfig);
+
+ ObjectMetadata metadata = new ObjectMetadata();
+ metadata.setContentLength(inputStream.available());
+ String bucketName = config.getQcloudBucketName() +"-"+ config.getQcloudAppId();
+ PutObjectRequest request = new PutObjectRequest(bucketName, path, inputStream, metadata);
+ PutObjectResult result = client.putObject(request);
+
+ client.shutdown();
+ if(result.getETag() == null){
+ throw new RenException(ErrorCode.OSS_UPLOAD_FILE_ERROR, "");
+ }
+ } catch (IOException e) {
+ throw new RenException(ErrorCode.OSS_UPLOAD_FILE_ERROR, e, "");
+ }
+
+ return config.getQcloudDomain() + "/" + path;
+ }
+
+ @Override
+ public String uploadSuffix(byte[] data, String suffix) {
+ return upload(data, getPath(config.getQcloudPrefix(), suffix));
+ }
+
+ @Override
+ public String uploadSuffix(InputStream inputStream, String suffix) {
+ return upload(inputStream, getPath(config.getQcloudPrefix(), suffix));
+ }
+}
\ No newline at end of file
diff --git a/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/QiniuCloudStorageService.java b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/QiniuCloudStorageService.java
new file mode 100644
index 0000000..dcd47f8
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/oss/cloud/QiniuCloudStorageService.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.oss.cloud;
+
+import com.qiniu.http.Response;
+import com.qiniu.storage.Configuration;
+import com.qiniu.storage.Region;
+import com.qiniu.storage.UploadManager;
+import com.qiniu.util.Auth;
+import com.qiniu.util.IOUtils;
+
+import io.bdty.common.exception.ErrorCode;
+import io.bdty.common.exception.RenException;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * 七牛云存储
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class QiniuCloudStorageService extends AbstractCloudStorageService {
+ private UploadManager uploadManager;
+ private String token;
+
+ public QiniuCloudStorageService(CloudStorageConfig config) {
+ this.config = config;
+
+ //初始化
+ init();
+ }
+
+ private void init() {
+ uploadManager = new UploadManager(new Configuration(Region.autoRegion()));
+ token = Auth.create(config.getQiniuAccessKey(), config.getQiniuSecretKey()).
+ uploadToken(config.getQiniuBucketName());
+
+ }
+
+ @Override
+ public String upload(byte[] data, String path) {
+ try {
+ Response res = uploadManager.put(data, path, token);
+ if (!res.isOK()) {
+ throw new RenException(ErrorCode.OSS_UPLOAD_FILE_ERROR, res.toString());
+ }
+ } catch (Exception e) {
+ throw new RenException(ErrorCode.OSS_UPLOAD_FILE_ERROR, e, "");
+ }
+
+ return config.getQiniuDomain() + "/" + path;
+ }
+
+ @Override
+ public String upload(InputStream inputStream, String path) {
+ try {
+ byte[] data = IOUtils.toByteArray(inputStream);
+ return this.upload(data, path);
+ } catch (IOException e) {
+ throw new RenException(ErrorCode.OSS_UPLOAD_FILE_ERROR, e, "");
+ }
+ }
+
+ @Override
+ public String uploadSuffix(byte[] data, String suffix) {
+ return upload(data, getPath(config.getQiniuPrefix(), suffix));
+ }
+
+ @Override
+ public String uploadSuffix(InputStream inputStream, String suffix) {
+ return upload(inputStream, getPath(config.getQiniuPrefix(), suffix));
+ }
+}
diff --git a/bdty-admin/src/main/java/io/bdty/modules/oss/controller/SysOssController.java b/bdty-admin/src/main/java/io/bdty/modules/oss/controller/SysOssController.java
new file mode 100644
index 0000000..ed3dcaf
--- /dev/null
+++ b/bdty-admin/src/main/java/io/bdty/modules/oss/controller/SysOssController.java
@@ -0,0 +1,171 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package io.bdty.modules.oss.controller;
+
+import cn.hutool.core.io.file.FileNameUtil;
+import io.bdty.common.annotation.LogOperation;
+import io.bdty.common.constant.Constant;
+import io.bdty.common.exception.ErrorCode;
+import io.bdty.common.page.PageData;
+import io.bdty.common.utils.JsonUtils;
+import io.bdty.common.utils.Result;
+import io.bdty.common.validator.ValidatorUtils;
+import io.bdty.common.validator.group.AliyunGroup;
+import io.bdty.common.validator.group.QcloudGroup;
+import io.bdty.common.validator.group.QiniuGroup;
+import io.bdty.modules.oss.cloud.CloudStorageConfig;
+import io.bdty.modules.oss.cloud.OSSFactory;
+import io.bdty.modules.oss.entity.SysOssEntity;
+import io.bdty.modules.oss.service.SysOssService;
+import io.bdty.modules.sys.service.SysParamsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 文件上传
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@RestController
+@RequestMapping("sys/oss")
+@Api(tags = "文件上传")
+public class SysOssController {
+ @Autowired
+ private SysOssService sysOssService;
+ @Autowired
+ private SysParamsService sysParamsService;
+
+
+ @Value("${file.uploadFolder}")
+ public String uploadFolder;
+
+ @Value("${file.staticAccessPath}")
+ public String staticAccessPath;
+
+ private final static String KEY = Constant.CLOUD_STORAGE_CONFIG_KEY;
+
+ @GetMapping("page")
+ @ApiOperation(value = "分页")
+ @RequiresPermissions("sys:oss:all")
+ public Result> page(@ApiIgnore @RequestParam Map params) {
+ PageData page = sysOssService.page(params);
+
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("info")
+ @ApiOperation(value = "云存储配置信息")
+ @RequiresPermissions("sys:oss:all")
+ public Result info() {
+ CloudStorageConfig config = sysParamsService.getValueObject(KEY, CloudStorageConfig.class);
+
+ return new Result().ok(config);
+ }
+
+ @PostMapping
+ @ApiOperation(value = "保存云存储配置信息")
+ @LogOperation("保存云存储配置信息")
+ @RequiresPermissions("sys:oss:all")
+ public Result saveConfig(@RequestBody CloudStorageConfig config) {
+ //校验类型
+ ValidatorUtils.validateEntity(config);
+
+ if (config.getType() == Constant.CloudService.QINIU.getValue()) {
+ //校验七牛数据
+ ValidatorUtils.validateEntity(config, QiniuGroup.class);
+ } else if (config.getType() == Constant.CloudService.ALIYUN.getValue()) {
+ //校验阿里云数据
+ ValidatorUtils.validateEntity(config, AliyunGroup.class);
+ } else if (config.getType() == Constant.CloudService.QCLOUD.getValue()) {
+ //校验腾讯云数据
+ ValidatorUtils.validateEntity(config, QcloudGroup.class);
+ }
+
+ sysParamsService.updateValueByCode(KEY, JsonUtils.toJsonString(config));
+
+ return new Result();
+ }
+
+ @PostMapping("upload")
+ @ApiOperation(value = "上传文件")
+ @RequiresPermissions("sys:oss:all")
+ public Result