- (一) 下载人人开源项目:
- (二) 创建数据库renren-fast,并执行建表语句
- (三) 修改后端项目renren-fast
- (四) 将renren-generator自动生成工程导入我们的项目中:
- (五) 修改renren-generatro相关资源
- (六) 修改zyg-common中依赖
- (七) 复制renren-fast中的文件到zyg_common的com.zelin.utils包中
- (八) 在zyg-pojo中引入依赖:
- (九) 在zyg-sellergoods-interface中引入依赖:
- (十) 在zyg-sellergoods-service中引入依赖:
- (十一) 在zyg-manager-web中引入依赖:
- (十二) 在zyg-dao中引入依赖:
- (十三) 在zyg-dao中添加配置文件:
- (十四) 将上面生成的资源放到后端项目
- (十五) 将上面生成的资源放到前端项目
- (十六) 在前端的项目:系统管理->菜单管理,创建菜单
- (十七) 修改前端config/index.js文件,添加内容
- (十八) 修改config/dev.env.js文件
- (十九) 修改linux中的nginx配置(处理跨域请求)
- (二十) 调整各个实体类的主键为String类型,否则,报错、
- (二十一) 最终品牌模块显示效果如下:
- (二十二) 用与前面同样的方法添加商品管理的其它模块:
- (二十三)项目最终运行效果如下:
- (二十四) docker环境下安装zookeeper:
(一) 下载人人开源项目:

项目说明: 1、renren-fast renren-fast是一个轻量级的Spring Boot2.1快速开发平台,其设计目标是开发迅速、学习简单、轻量级、易扩展;使用Spring Boot、Shiro、MyBatis、Redis、Bootstrap、Vue2.x等框架,包含:管理员列表、角色管理、菜单管理、定时任务、参数管理… 2、renren-generator 人人开源项目的代码生成器,可在线生成entity、xml、dao、service、vue、sql代码,减少70%以上的开发任务 3、renren-fast-vue renren-fast-vue基于vue、element-ui构建开发,实现renren-fast后台管理前端功能,提供一套更优的前端解决方案。 4、去掉各个项目中的.git文件夹。
(二) 创建数据库renren-fast,并执行建表语句
2.1_ 执行如下sql语句:
-- 菜单CREATE TABLE `sys_menu` (`menu_id` bigint NOT NULL AUTO_INCREMENT,`parent_id` bigint COMMENT '父菜单ID,一级菜单为0',`name` varchar(50) COMMENT '菜单名称',`url` varchar(200) COMMENT '菜单URL',`perms` varchar(500) COMMENT '授权(多个用逗号分隔,如:user:list,user:create)',`type` int COMMENT '类型 0:目录 1:菜单 2:按钮',`icon` varchar(50) COMMENT '菜单图标',`order_num` int COMMENT '排序',PRIMARY KEY (`menu_id`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='菜单管理';-- 系统用户CREATE TABLE `sys_user` (`user_id` bigint NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL COMMENT '用户名',`password` varchar(100) COMMENT '密码',`salt` varchar(20) COMMENT '盐',`email` varchar(100) COMMENT '邮箱',`mobile` varchar(100) COMMENT '手机号',`status` tinyint COMMENT '状态 0:禁用 1:正常',`create_user_id` bigint(20) COMMENT '创建者ID',`create_time` datetime COMMENT '创建时间',PRIMARY KEY (`user_id`),UNIQUE INDEX (`username`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统用户';-- 系统用户TokenCREATE TABLE `sys_user_token` (`user_id` bigint(20) NOT NULL,`token` varchar(100) NOT NULL COMMENT 'token',`expire_time` datetime DEFAULT NULL COMMENT '过期时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`user_id`),UNIQUE KEY `token` (`token`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统用户Token';-- 系统验证码CREATE TABLE `sys_captcha` (`uuid` char(36) NOT NULL COMMENT 'uuid',`code` varchar(6) NOT NULL COMMENT '验证码',`expire_time` datetime DEFAULT NULL COMMENT '过期时间',PRIMARY KEY (`uuid`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统验证码';-- 角色CREATE TABLE `sys_role` (`role_id` bigint NOT NULL AUTO_INCREMENT,`role_name` varchar(100) COMMENT '角色名称',`remark` varchar(100) COMMENT '备注',`create_user_id` bigint(20) COMMENT '创建者ID',`create_time` datetime COMMENT '创建时间',PRIMARY KEY (`role_id`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='角色';-- 用户与角色对应关系CREATE TABLE `sys_user_role` (`id` bigint NOT NULL AUTO_INCREMENT,`user_id` bigint COMMENT '用户ID',`role_id` bigint COMMENT '角色ID',PRIMARY KEY (`id`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='用户与角色对应关系';-- 角色与菜单对应关系CREATE TABLE `sys_role_menu` (`id` bigint NOT NULL AUTO_INCREMENT,`role_id` bigint COMMENT '角色ID',`menu_id` bigint COMMENT '菜单ID',PRIMARY KEY (`id`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='角色与菜单对应关系';-- 系统配置信息CREATE TABLE `sys_config` (`id` bigint NOT NULL AUTO_INCREMENT,`param_key` varchar(50) COMMENT 'key',`param_value` varchar(2000) COMMENT 'value',`status` tinyint DEFAULT 1 COMMENT '状态 0:隐藏 1:显示',`remark` varchar(500) COMMENT '备注',PRIMARY KEY (`id`),UNIQUE INDEX (`param_key`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统配置信息表';-- 系统日志CREATE TABLE `sys_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`username` varchar(50) COMMENT '用户名',`operation` varchar(50) COMMENT '用户操作',`method` varchar(200) COMMENT '请求方法',`params` varchar(5000) COMMENT '请求参数',`time` bigint NOT NULL COMMENT '执行时长(毫秒)',`ip` varchar(64) COMMENT 'IP地址',`create_date` datetime COMMENT '创建时间',PRIMARY KEY (`id`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统日志';-- 文件上传CREATE TABLE `sys_oss` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`url` varchar(200) COMMENT 'URL地址',`create_date` datetime COMMENT '创建时间',PRIMARY KEY (`id`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='文件上传';-- 定时任务CREATE TABLE `schedule_job` (`job_id` bigint(20) NOT NULL AUTO_INCREMENT 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(4) DEFAULT NULL COMMENT '任务状态 0:正常 1:暂停',`remark` varchar(255) DEFAULT NULL COMMENT '备注',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`job_id`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='定时任务';-- 定时任务日志CREATE TABLE `schedule_job_log` (`log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志id',`job_id` bigint(20) NOT NULL COMMENT '任务id',`bean_name` varchar(200) DEFAULT NULL COMMENT 'spring bean名称',`params` varchar(2000) DEFAULT NULL COMMENT '参数',`status` tinyint(4) NOT NULL COMMENT '任务状态 0:成功 1:失败',`error` varchar(2000) DEFAULT NULL COMMENT '失败信息',`times` int(11) NOT NULL COMMENT '耗时(单位:毫秒)',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`log_id`),KEY `job_id` (`job_id`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='定时任务日志';-- 用户表CREATE TABLE `tb_user` (`user_id` bigint NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL COMMENT '用户名',`mobile` varchar(20) NOT NULL COMMENT '手机号',`password` varchar(64) COMMENT '密码',`create_time` datetime COMMENT '创建时间',PRIMARY KEY (`user_id`),UNIQUE INDEX (`username`)) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='用户';-- 初始数据INSERT INTO `sys_user` (`user_id`, `username`, `password`, `salt`, `email`, `mobile`, `status`, `create_user_id`, `create_time`) VALUES ('1', 'admin', '9ec9750e709431dad22365cabc5c625482e574c74adaebba7dd02f1129e4ce1d', 'YzcmCZNvbXocrsz9dm8e', 'root@renren.io', '13612345678', '1', '1', '2016-11-11 11:11:11');INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (1, 0, '系统管理', NULL, NULL, 0, 'system', 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (2, 1, '管理员列表', 'sys/user', NULL, 1, 'admin', 1);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (3, 1, '角色管理', 'sys/role', NULL, 1, 'role', 2);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (4, 1, '菜单管理', 'sys/menu', NULL, 1, 'menu', 3);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (5, 1, 'SQL监控', 'http://localhost:8080/renren-fast/druid/sql.html', NULL, 1, 'sql', 4);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (6, 1, '定时任务', 'job/schedule', NULL, 1, 'job', 5);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (7, 6, '查看', NULL, 'sys:schedule:list,sys:schedule:info', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (8, 6, '新增', NULL, 'sys:schedule:save', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (9, 6, '修改', NULL, 'sys:schedule:update', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (10, 6, '删除', NULL, 'sys:schedule:delete', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (11, 6, '暂停', NULL, 'sys:schedule:pause', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (12, 6, '恢复', NULL, 'sys:schedule:resume', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (13, 6, '立即执行', NULL, 'sys:schedule:run', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (14, 6, '日志列表', NULL, 'sys:schedule:log', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (15, 2, '查看', NULL, 'sys:user:list,sys:user:info', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (16, 2, '新增', NULL, 'sys:user:save,sys:role:select', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (17, 2, '修改', NULL, 'sys:user:update,sys:role:select', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (18, 2, '删除', NULL, 'sys:user:delete', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (19, 3, '查看', NULL, 'sys:role:list,sys:role:info', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (20, 3, '新增', NULL, 'sys:role:save,sys:menu:list', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (21, 3, '修改', NULL, 'sys:role:update,sys:menu:list', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (22, 3, '删除', NULL, 'sys:role:delete', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (23, 4, '查看', NULL, 'sys:menu:list,sys:menu:info', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (24, 4, '新增', NULL, 'sys:menu:save,sys:menu:select', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (25, 4, '修改', NULL, 'sys:menu:update,sys:menu:select', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (26, 4, '删除', NULL, 'sys:menu:delete', 2, NULL, 0);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (27, 1, '参数管理', 'sys/config', 'sys:config:list,sys:config:info,sys:config:save,sys:config:update,sys:config:delete', 1, 'config', 6);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (29, 1, '系统日志', 'sys/log', 'sys:log:list', 1, 'log', 7);INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (30, 1, '文件上传', 'oss/oss', 'sys:oss:all', 1, 'oss', 6);INSERT INTO `sys_config` (`param_key`, `param_value`, `status`, `remark`) VALUES ('CLOUD_STORAGE_CONFIG_KEY', '{\"aliyunAccessKeyId\":\"\",\"aliyunAccessKeySecret\":\"\",\"aliyunBucketName\":\"\",\"aliyunDomain\":\"\",\"aliyunEndPoint\":\"\",\"aliyunPrefix\":\"\",\"qcloudBucketName\":\"\",\"qcloudDomain\":\"\",\"qcloudPrefix\":\"\",\"qcloudSecretId\":\"\",\"qcloudSecretKey\":\"\",\"qiniuAccessKey\":\"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ\",\"qiniuBucketName\":\"ios-app\",\"qiniuDomain\":\"http://7xqbwh.dl1.z0.glb.clouddn.com\",\"qiniuPrefix\":\"upload\",\"qiniuSecretKey\":\"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV\",\"type\":1}', '0', '云存储配置信息');INSERT INTO `schedule_job` (`bean_name`, `params`, `cron_expression`, `status`, `remark`, `create_time`) VALUES ('testTask', 'renren', '0 0/30 * * * ?', '0', '参数测试', now());-- 账号:13612345678 密码:adminINSERT INTO `tb_user` (`username`, `mobile`, `password`, `create_time`) VALUES ('mark', '13612345678', '8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918', '2017-03-23 22:37:41');-- 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);
2.2_ 数据库结构如下:
(三) 修改后端项目renren-fast
(四) 将renren-generator自动生成工程导入我们的项目中:

注意: 1、引入完项目后,将renren-fast及renren-generator这两个项目在右侧的maven面板中引入其对应的pom文件,这样项目才会真正导入到我们的泽易购项目中。 2、在安装前端项目renren-fast-vue时,执行如下命令:
npm installnpm install node-sass@latest
说明: 如果在执行上述第一条命令出现错误,报node-sass相关的错误,此时需要安装node-sass,再执行第二条命令安装
(五) 修改renren-generatro相关资源
5.1_ 修改generator.properties文件
#代码生成器,配置信息mainPath=com.zelin#包名package=com.zelin#模板名moduleName=manager#作者author=WFemail=2568783935@qq.com#表前缀(类名不会包含表前缀)tablePrefix=tb_...
5.2_ 修改application.yml文件中要自动生成的数据库
spring:datasource:type: com.alibaba.druid.pool.DruidDataSource#MySQL配置driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.56.10:3306/zeyigoudb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123
5.3_ 注掉resources/temlate/Controller.java.vm关于权限相关的内容
package ${package}.${moduleName}.controller;import java.util.Arrays;import java.util.Map;//import org.apache.shiro.authz.annotation.RequiresPermissions;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import ${package}.${moduleName}.entity.${className}Entity;import ${package}.${moduleName}.service.${className}Service;import ${mainPath}.common.utils.PageUtils;import ${mainPath}.common.utils.R;/*** ${comments}* @author ${author}* @email ${email}* @date ${datetime}*/@RestController@RequestMapping("${moduleName}/${pathName}")public class ${className}Controller {@Autowiredprivate ${className}Service ${classname}Service;/*** 列表*/@RequestMapping("/list")//@RequiresPermissions("${moduleName}:${pathName}:list")public R list(@RequestParam Map<String, Object> params){PageUtils page = ${classname}Service.queryPage(params);return R.ok().put("page", page);}/*** 信息*/@RequestMapping("/info/{${pk.attrname}}")//@RequiresPermissions("${moduleName}:${pathName}:info")public R info(@PathVariable("${pk.attrname}") ${pk.attrType} ${pk.attrname}){${className}Entity ${classname} = ${classname}Service.getById(${pk.attrname});return R.ok().put("${classname}", ${classname});}/*** 保存*/@RequestMapping("/save")//@RequiresPermissions("${moduleName}:${pathName}:save")public R save(@RequestBody ${className}Entity ${classname}){${classname}Service.save(${classname});return R.ok();}/*** 修改*/@RequestMapping("/update")//@RequiresPermissions("${moduleName}:${pathName}:update")public R update(@RequestBody ${className}Entity ${classname}){${classname}Service.updateById(${classname});return R.ok();}/*** 删除*/@RequestMapping("/delete")//@RequiresPermissions("${moduleName}:${pathName}:delete")public R delete(@RequestBody ${pk.attrType}[] ${pk.attrname}s){${classname}Service.removeByIds(Arrays.asList(${pk.attrname}s));return R.ok();}}
5.4_ 启动renren-generator项目:
5.5_ 选择要生成的表,点击“生成代码”,同时生成前端与后端代码
(六) 修改zyg-common中依赖
<dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><dependency><groupId>com.gitee.reger</groupId><artifactId>spring-boot-starter-dubbo</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.2.1</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.2.1</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency></dependencies>
(七) 复制renren-fast中的文件到zyg_common的com.zelin.utils包中
(八) 在zyg-pojo中引入依赖:
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.0</version></dependency><dependency><groupId>jakarta.persistence</groupId><artifactId>jakarta.persistence-api</artifactId><version>2.2.3</version></dependency><dependency><groupId>com.zelin</groupId><artifactId>zyg-common</artifactId><version>2.0</version></dependency></dependencies>
(九) 在zyg-sellergoods-interface中引入依赖:
<dependencies><dependency><groupId>com.zelin</groupId><artifactId>zyg-pojo</artifactId><version>2.0</version></dependency></dependencies>
(十) 在zyg-sellergoods-service中引入依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.zelin</groupId><artifactId>zyg-sellergoods-interface</artifactId><version>2.0</version></dependency><dependency><groupId>com.zelin</groupId><artifactId>zyg-dao</artifactId><version>2.0</version></dependency></dependencies>
(十一) 在zyg-manager-web中引入依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.zelin</groupId><artifactId>zyg-sellergoods-service</artifactId><version>2.0</version></dependency></dependencies>
(十二) 在zyg-dao中引入依赖:
<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><dependency><groupId>com.zelin</groupId><artifactId>zyg-pojo</artifactId><version>2.0</version></dependency></dependencies>
(十三) 在zyg-dao中添加配置文件:
/*** 功能: 配置分页插件* 参数:* 返回值:* 时间: 2021/7/23 15:13*/@Configuration@MapperScan("com.zelin.dao")public class MybatisPlusConfig {// 最新版(配置分页插件)@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptorPage() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));return interceptor;}// 配置乐观锁@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptorLock() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}}
@Configuration@PropertySource("classpath:jdbc.properties") //读取指定配置文件 不指定默认读取:application.properties或application.yml文件public class MyDataSourceConfig {//下面将jdbc.properties文件中的jdbc前缀去掉后,得到的key作为dataSouce的属性进行匹配并将配置文件中的值注入到dataSource属性中@Bean@ConfigurationProperties(prefix = "jdbc")public DataSource druidDataSource(){DruidDataSource dataSource = new DruidDataSource();return dataSource;}}
(十四) 将上面生成的资源放到后端项目
(十五) 将上面生成的资源放到前端项目
(十六) 在前端的项目:系统管理->菜单管理,创建菜单
16.1_ 创建完成如下图所示:
16.2_ 这两个菜单在数据库表sys_menu中的记录如下:
16.3_ 这两个菜单在数据库表sys_menu中的记录如下:
(十七) 修改前端config/index.js文件,添加内容
module.exports = {dev: {// PathsassetsSubDirectory: 'static',assetsPublicPath: '/',// 代理列表, 是否开启代理通过[./dev.env.js]配置proxyTable: devEnv.OPEN_PROXY === false ? {} : {'/proxyApi': {target: 'http://zeyigou.com',changeOrigin: true,pathRewrite: {'^/proxyApi': '/'}}},hot:true, //加上这句才会进行热启动...}
(十八) 修改config/dev.env.js文件
module.exports = merge(prodEnv, {NODE_ENV: '"development"',OPEN_PROXY: true // 是否开启代理, 重置后需重启vue-cli})
此时,追踪源码src/utils/httpRequest.js文件,可以看到如下代码:
/*** 请求地址处理* @param {*} actionName action方法名称*/http.adornUrl = (actionName) => {// 非生产环境 && 开启代理, 接口前缀统一使用[/proxyApi/]前缀做代理拦截!return (process.env.NODE_ENV !== 'production' && process.env.OPEN_PROXY ? '/proxyApi/' : window.SITE_CONFIG.baseUrl) + actionName}
分析: 1、可以看到,此时会在每个请求前添加:/proxyApi 前缀 2、查看 config/index.js文件中的路由表可知,此时页面会自动跳转到http://zeyigou.com页面.
(十九) 修改linux中的nginx配置(处理跨域请求)
19.1_ 分析nginx的目录结构:


下面是conf/nginx.conf文件内容,引入了我们自定义的配置文件:
添加我们自定义的配置文件conf/conf.d/zeyigou.conf,内容如下:
server {listen 80;server_name zeyigou.com;location / {proxy_pass http://192.168.56.1:8080/renren-fast/;proxy_set_header Host $host;}location /manager {proxy_pass http://192.168.56.1:9001/;proxy_set_header Host $host;}}
说明: 1、其中server代表定义一个服务器节点。 2、listen 代表定义服务器的监听端口。 3、server_name 代表服务器名称。 4、location 代表映射路径的位置节点,一个服务器可以映射多个。 5、proxy_pass 代表配置反向代理服务器,如:我们访问zeyigou.com时会跳转到windows电脑(ip=192.168.56.1)下的/renren-fast下,我们访问zeyigou.com/manager时会跳转到windows电脑中的9001端口下。 6、上面的配置主要是为了解决前后端开发中的跨域问题。
19.2_ 重启nginx服务器:
docker restart nginx
19.3_ 前后端开发中的跨域流程及原理分析【时序图】:

(二十) 调整各个实体类的主键为String类型,否则,报错、

上述问题,也可以在生成实体类时,修改renren-generator的generator.properties文件中关于类型的定义。 问题原因:前端得到的number类型只支持到16位精度,而idworker生成的id为19位精度,所以会丢失精度!
重点强调:因为String类型的查询效率比基本类型要低,所以,我们可以在zyg-dao中添加一个配置文件,将根据雪花算法得到id在后端转换为String送到前端显示! JacksonConfig.java内容如下:
@Configurationpublic class JacksonConfig {@Bean@Primary@ConditionalOnMissingBean(ObjectMapper.class)public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder){ObjectMapper objectMapper = builder.createXmlMapper(false).build();// 全局配置序列化返回 JSON 处理SimpleModule simpleModule = new SimpleModule();//JSON Long ==> String(前后端Long类型传到前端转成字符串)simpleModule.addSerializer(Long.class, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);return objectMapper;}}
(二十一) 最终品牌模块显示效果如下:
(二十二) 用与前面同样的方法添加商品管理的其它模块:
(二十三)项目最终运行效果如下:
(二十四) docker环境下安装zookeeper:
24.1 命令:
mkdir -p /mydata/zookeeper/confmkdir -p /mydata/zookeeper/datacd /mydatachmod -R 777 zookeeperdocker run --name zk --privileged=true -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart always -d -v $(pwd)/conf:/conf zookeeper进入zoo.cfg文件,修改data目录位置:/mydata/zookeeper/data
24.2 步骤:
0、创建/mydata/zookeeper/conf /mydata/zookeeper/data 两个目录。1、切到/mydata/目录,执行:chmod -R 777 zookeeper2、再执行命令:docker run --name zk --privileged=true -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart always -d -v $(pwd)/conf:/conf zookeeper3、进入zoo.cfg文件,修改data目录位置:/mydata/zookeeper/data
24.3 zookeeper客户端的常用命令:
//1. 进入docker中的zk容器dokcer exec -it zk /bin/bash//2. 进到客户端cd bin./zkCli.sh//3. 查看zookeeper中所有节点ls /dubbo//查看到dubbo节点中如下的子节点:【下面是查看到的结果】[com.zelin.content.service.ContentService, com.zelin.sellergoods.service.BrandService, com.zelin.service.StudentService]












重点强调:因为String类型的查询效率比基本类型要低,所以,我们可以在zyg-dao中添加一个配置文件,将根据雪花算法得到id在后端转换为String送到前端显示!
JacksonConfig.java内容如下:
