(一) 下载人人开源项目:

image.png

项目说明: 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,并执行建表语句

image.png

2.1_ 执行如下sql语句:

  1. -- 菜单
  2. CREATE TABLE `sys_menu` (
  3. `menu_id` bigint NOT NULL AUTO_INCREMENT,
  4. `parent_id` bigint COMMENT '父菜单ID,一级菜单为0',
  5. `name` varchar(50) COMMENT '菜单名称',
  6. `url` varchar(200) COMMENT '菜单URL',
  7. `perms` varchar(500) COMMENT '授权(多个用逗号分隔,如:user:list,user:create)',
  8. `type` int COMMENT '类型 0:目录 1:菜单 2:按钮',
  9. `icon` varchar(50) COMMENT '菜单图标',
  10. `order_num` int COMMENT '排序',
  11. PRIMARY KEY (`menu_id`)
  12. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='菜单管理';
  13. -- 系统用户
  14. CREATE TABLE `sys_user` (
  15. `user_id` bigint NOT NULL AUTO_INCREMENT,
  16. `username` varchar(50) NOT NULL COMMENT '用户名',
  17. `password` varchar(100) COMMENT '密码',
  18. `salt` varchar(20) COMMENT '盐',
  19. `email` varchar(100) COMMENT '邮箱',
  20. `mobile` varchar(100) COMMENT '手机号',
  21. `status` tinyint COMMENT '状态 0:禁用 1:正常',
  22. `create_user_id` bigint(20) COMMENT '创建者ID',
  23. `create_time` datetime COMMENT '创建时间',
  24. PRIMARY KEY (`user_id`),
  25. UNIQUE INDEX (`username`)
  26. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统用户';
  27. -- 系统用户Token
  28. CREATE TABLE `sys_user_token` (
  29. `user_id` bigint(20) NOT NULL,
  30. `token` varchar(100) NOT NULL COMMENT 'token',
  31. `expire_time` datetime DEFAULT NULL COMMENT '过期时间',
  32. `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  33. PRIMARY KEY (`user_id`),
  34. UNIQUE KEY `token` (`token`)
  35. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统用户Token';
  36. -- 系统验证码
  37. CREATE TABLE `sys_captcha` (
  38. `uuid` char(36) NOT NULL COMMENT 'uuid',
  39. `code` varchar(6) NOT NULL COMMENT '验证码',
  40. `expire_time` datetime DEFAULT NULL COMMENT '过期时间',
  41. PRIMARY KEY (`uuid`)
  42. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统验证码';
  43. -- 角色
  44. CREATE TABLE `sys_role` (
  45. `role_id` bigint NOT NULL AUTO_INCREMENT,
  46. `role_name` varchar(100) COMMENT '角色名称',
  47. `remark` varchar(100) COMMENT '备注',
  48. `create_user_id` bigint(20) COMMENT '创建者ID',
  49. `create_time` datetime COMMENT '创建时间',
  50. PRIMARY KEY (`role_id`)
  51. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='角色';
  52. -- 用户与角色对应关系
  53. CREATE TABLE `sys_user_role` (
  54. `id` bigint NOT NULL AUTO_INCREMENT,
  55. `user_id` bigint COMMENT '用户ID',
  56. `role_id` bigint COMMENT '角色ID',
  57. PRIMARY KEY (`id`)
  58. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='用户与角色对应关系';
  59. -- 角色与菜单对应关系
  60. CREATE TABLE `sys_role_menu` (
  61. `id` bigint NOT NULL AUTO_INCREMENT,
  62. `role_id` bigint COMMENT '角色ID',
  63. `menu_id` bigint COMMENT '菜单ID',
  64. PRIMARY KEY (`id`)
  65. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='角色与菜单对应关系';
  66. -- 系统配置信息
  67. CREATE TABLE `sys_config` (
  68. `id` bigint NOT NULL AUTO_INCREMENT,
  69. `param_key` varchar(50) COMMENT 'key',
  70. `param_value` varchar(2000) COMMENT 'value',
  71. `status` tinyint DEFAULT 1 COMMENT '状态 0:隐藏 1:显示',
  72. `remark` varchar(500) COMMENT '备注',
  73. PRIMARY KEY (`id`),
  74. UNIQUE INDEX (`param_key`)
  75. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统配置信息表';
  76. -- 系统日志
  77. CREATE TABLE `sys_log` (
  78. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  79. `username` varchar(50) COMMENT '用户名',
  80. `operation` varchar(50) COMMENT '用户操作',
  81. `method` varchar(200) COMMENT '请求方法',
  82. `params` varchar(5000) COMMENT '请求参数',
  83. `time` bigint NOT NULL COMMENT '执行时长(毫秒)',
  84. `ip` varchar(64) COMMENT 'IP地址',
  85. `create_date` datetime COMMENT '创建时间',
  86. PRIMARY KEY (`id`)
  87. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='系统日志';
  88. -- 文件上传
  89. CREATE TABLE `sys_oss` (
  90. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  91. `url` varchar(200) COMMENT 'URL地址',
  92. `create_date` datetime COMMENT '创建时间',
  93. PRIMARY KEY (`id`)
  94. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='文件上传';
  95. -- 定时任务
  96. CREATE TABLE `schedule_job` (
  97. `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务id',
  98. `bean_name` varchar(200) DEFAULT NULL COMMENT 'spring bean名称',
  99. `params` varchar(2000) DEFAULT NULL COMMENT '参数',
  100. `cron_expression` varchar(100) DEFAULT NULL COMMENT 'cron表达式',
  101. `status` tinyint(4) DEFAULT NULL COMMENT '任务状态 0:正常 1:暂停',
  102. `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  103. `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  104. PRIMARY KEY (`job_id`)
  105. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='定时任务';
  106. -- 定时任务日志
  107. CREATE TABLE `schedule_job_log` (
  108. `log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志id',
  109. `job_id` bigint(20) NOT NULL COMMENT '任务id',
  110. `bean_name` varchar(200) DEFAULT NULL COMMENT 'spring bean名称',
  111. `params` varchar(2000) DEFAULT NULL COMMENT '参数',
  112. `status` tinyint(4) NOT NULL COMMENT '任务状态 0:成功 1:失败',
  113. `error` varchar(2000) DEFAULT NULL COMMENT '失败信息',
  114. `times` int(11) NOT NULL COMMENT '耗时(单位:毫秒)',
  115. `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  116. PRIMARY KEY (`log_id`),
  117. KEY `job_id` (`job_id`)
  118. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='定时任务日志';
  119. -- 用户表
  120. CREATE TABLE `tb_user` (
  121. `user_id` bigint NOT NULL AUTO_INCREMENT,
  122. `username` varchar(50) NOT NULL COMMENT '用户名',
  123. `mobile` varchar(20) NOT NULL COMMENT '手机号',
  124. `password` varchar(64) COMMENT '密码',
  125. `create_time` datetime COMMENT '创建时间',
  126. PRIMARY KEY (`user_id`),
  127. UNIQUE INDEX (`username`)
  128. ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT='用户';
  129. -- 初始数据
  130. 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');
  131. INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (1, 0, '系统管理', NULL, NULL, 0, 'system', 0);
  132. INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (2, 1, '管理员列表', 'sys/user', NULL, 1, 'admin', 1);
  133. INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (3, 1, '角色管理', 'sys/role', NULL, 1, 'role', 2);
  134. INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (4, 1, '菜单管理', 'sys/menu', NULL, 1, 'menu', 3);
  135. 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);
  136. INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (6, 1, '定时任务', 'job/schedule', NULL, 1, 'job', 5);
  137. 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);
  138. 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);
  139. 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);
  140. 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);
  141. 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);
  142. 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);
  143. 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);
  144. 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);
  145. 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);
  146. 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);
  147. 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);
  148. 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);
  149. 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);
  150. 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);
  151. 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);
  152. 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);
  153. 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);
  154. 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);
  155. 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);
  156. 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);
  157. 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);
  158. 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);
  159. 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);
  160. 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', '云存储配置信息');
  161. INSERT INTO `schedule_job` (`bean_name`, `params`, `cron_expression`, `status`, `remark`, `create_time`) VALUES ('testTask', 'renren', '0 0/30 * * * ?', '0', '参数测试', now());
  162. -- 账号:13612345678 密码:admin
  163. INSERT INTO `tb_user` (`username`, `mobile`, `password`, `create_time`) VALUES ('mark', '13612345678', '8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918', '2017-03-23 22:37:41');
  164. -- quartz自带表结构
  165. CREATE TABLE QRTZ_JOB_DETAILS(
  166. SCHED_NAME VARCHAR(120) NOT NULL,
  167. JOB_NAME VARCHAR(200) NOT NULL,
  168. JOB_GROUP VARCHAR(200) NOT NULL,
  169. DESCRIPTION VARCHAR(250) NULL,
  170. JOB_CLASS_NAME VARCHAR(250) NOT NULL,
  171. IS_DURABLE VARCHAR(1) NOT NULL,
  172. IS_NONCONCURRENT VARCHAR(1) NOT NULL,
  173. IS_UPDATE_DATA VARCHAR(1) NOT NULL,
  174. REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
  175. JOB_DATA BLOB NULL,
  176. PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
  177. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  178. CREATE TABLE QRTZ_TRIGGERS (
  179. SCHED_NAME VARCHAR(120) NOT NULL,
  180. TRIGGER_NAME VARCHAR(200) NOT NULL,
  181. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  182. JOB_NAME VARCHAR(200) NOT NULL,
  183. JOB_GROUP VARCHAR(200) NOT NULL,
  184. DESCRIPTION VARCHAR(250) NULL,
  185. NEXT_FIRE_TIME BIGINT(13) NULL,
  186. PREV_FIRE_TIME BIGINT(13) NULL,
  187. PRIORITY INTEGER NULL,
  188. TRIGGER_STATE VARCHAR(16) NOT NULL,
  189. TRIGGER_TYPE VARCHAR(8) NOT NULL,
  190. START_TIME BIGINT(13) NOT NULL,
  191. END_TIME BIGINT(13) NULL,
  192. CALENDAR_NAME VARCHAR(200) NULL,
  193. MISFIRE_INSTR SMALLINT(2) NULL,
  194. JOB_DATA BLOB NULL,
  195. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  196. FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
  197. REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
  198. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  199. CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
  200. SCHED_NAME VARCHAR(120) NOT NULL,
  201. TRIGGER_NAME VARCHAR(200) NOT NULL,
  202. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  203. REPEAT_COUNT BIGINT(7) NOT NULL,
  204. REPEAT_INTERVAL BIGINT(12) NOT NULL,
  205. TIMES_TRIGGERED BIGINT(10) NOT NULL,
  206. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  207. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  208. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  209. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  210. CREATE TABLE QRTZ_CRON_TRIGGERS (
  211. SCHED_NAME VARCHAR(120) NOT NULL,
  212. TRIGGER_NAME VARCHAR(200) NOT NULL,
  213. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  214. CRON_EXPRESSION VARCHAR(120) NOT NULL,
  215. TIME_ZONE_ID VARCHAR(80),
  216. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  217. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  218. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  219. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  220. CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  221. (
  222. SCHED_NAME VARCHAR(120) NOT NULL,
  223. TRIGGER_NAME VARCHAR(200) NOT NULL,
  224. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  225. STR_PROP_1 VARCHAR(512) NULL,
  226. STR_PROP_2 VARCHAR(512) NULL,
  227. STR_PROP_3 VARCHAR(512) NULL,
  228. INT_PROP_1 INT NULL,
  229. INT_PROP_2 INT NULL,
  230. LONG_PROP_1 BIGINT NULL,
  231. LONG_PROP_2 BIGINT NULL,
  232. DEC_PROP_1 NUMERIC(13,4) NULL,
  233. DEC_PROP_2 NUMERIC(13,4) NULL,
  234. BOOL_PROP_1 VARCHAR(1) NULL,
  235. BOOL_PROP_2 VARCHAR(1) NULL,
  236. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  237. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  238. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  239. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  240. CREATE TABLE QRTZ_BLOB_TRIGGERS (
  241. SCHED_NAME VARCHAR(120) NOT NULL,
  242. TRIGGER_NAME VARCHAR(200) NOT NULL,
  243. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  244. BLOB_DATA BLOB NULL,
  245. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  246. INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
  247. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  248. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  249. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  250. CREATE TABLE QRTZ_CALENDARS (
  251. SCHED_NAME VARCHAR(120) NOT NULL,
  252. CALENDAR_NAME VARCHAR(200) NOT NULL,
  253. CALENDAR BLOB NOT NULL,
  254. PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
  255. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  256. CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
  257. SCHED_NAME VARCHAR(120) NOT NULL,
  258. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  259. PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
  260. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  261. CREATE TABLE QRTZ_FIRED_TRIGGERS (
  262. SCHED_NAME VARCHAR(120) NOT NULL,
  263. ENTRY_ID VARCHAR(95) NOT NULL,
  264. TRIGGER_NAME VARCHAR(200) NOT NULL,
  265. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  266. INSTANCE_NAME VARCHAR(200) NOT NULL,
  267. FIRED_TIME BIGINT(13) NOT NULL,
  268. SCHED_TIME BIGINT(13) NOT NULL,
  269. PRIORITY INTEGER NOT NULL,
  270. STATE VARCHAR(16) NOT NULL,
  271. JOB_NAME VARCHAR(200) NULL,
  272. JOB_GROUP VARCHAR(200) NULL,
  273. IS_NONCONCURRENT VARCHAR(1) NULL,
  274. REQUESTS_RECOVERY VARCHAR(1) NULL,
  275. PRIMARY KEY (SCHED_NAME,ENTRY_ID))
  276. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  277. CREATE TABLE QRTZ_SCHEDULER_STATE (
  278. SCHED_NAME VARCHAR(120) NOT NULL,
  279. INSTANCE_NAME VARCHAR(200) NOT NULL,
  280. LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
  281. CHECKIN_INTERVAL BIGINT(13) NOT NULL,
  282. PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
  283. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  284. CREATE TABLE QRTZ_LOCKS (
  285. SCHED_NAME VARCHAR(120) NOT NULL,
  286. LOCK_NAME VARCHAR(40) NOT NULL,
  287. PRIMARY KEY (SCHED_NAME,LOCK_NAME))
  288. ENGINE=InnoDB DEFAULT CHARSET=utf8;
  289. CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
  290. CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
  291. CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
  292. CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
  293. CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
  294. CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
  295. CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
  296. CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
  297. CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
  298. CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
  299. CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
  300. CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
  301. CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
  302. CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
  303. CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
  304. CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
  305. CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
  306. CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
  307. CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
  308. CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);

2.2_ 数据库结构如下:

image.png

(三) 修改后端项目renren-fast

image.png
启动成功:
image.png

(四) 将renren-generator自动生成工程导入我们的项目中:

image.png

注意: 1、引入完项目后,将renren-fast及renren-generator这两个项目在右侧的maven面板中引入其对应的pom文件,这样项目才会真正导入到我们的泽易购项目中。 2、在安装前端项目renren-fast-vue时,执行如下命令:

  1. npm install
  2. npm install node-sass@latest

说明: 如果在执行上述第一条命令出现错误,报node-sass相关的错误,此时需要安装node-sass,再执行第二条命令安装

(五) 修改renren-generatro相关资源

5.1_ 修改generator.properties文件

  1. #代码生成器,配置信息
  2. mainPath=com.zelin
  3. #包名
  4. package=com.zelin
  5. #模板名
  6. moduleName=manager
  7. #作者
  8. author=WF
  9. #Email
  10. email=2568783935@qq.com
  11. #表前缀(类名不会包含表前缀)
  12. tablePrefix=tb_
  13. ...

5.2_ 修改application.yml文件中要自动生成的数据库

  1. spring:
  2. datasource:
  3. type: com.alibaba.druid.pool.DruidDataSource
  4. #MySQL配置
  5. driverClassName: com.mysql.cj.jdbc.Driver
  6. url: jdbc:mysql://192.168.56.10:3306/zeyigoudb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
  7. username: root
  8. password: 123

5.3_ 注掉resources/temlate/Controller.java.vm关于权限相关的内容

  1. package ${package}.${moduleName}.controller;
  2. import java.util.Arrays;
  3. import java.util.Map;
  4. //import org.apache.shiro.authz.annotation.RequiresPermissions;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RequestBody;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestParam;
  10. import org.springframework.web.bind.annotation.RestController;
  11. import ${package}.${moduleName}.entity.${className}Entity;
  12. import ${package}.${moduleName}.service.${className}Service;
  13. import ${mainPath}.common.utils.PageUtils;
  14. import ${mainPath}.common.utils.R;
  15. /**
  16. * ${comments}
  17. * @author ${author}
  18. * @email ${email}
  19. * @date ${datetime}
  20. */
  21. @RestController
  22. @RequestMapping("${moduleName}/${pathName}")
  23. public class ${className}Controller {
  24. @Autowired
  25. private ${className}Service ${classname}Service;
  26. /**
  27. * 列表
  28. */
  29. @RequestMapping("/list")
  30. //@RequiresPermissions("${moduleName}:${pathName}:list")
  31. public R list(@RequestParam Map<String, Object> params){
  32. PageUtils page = ${classname}Service.queryPage(params);
  33. return R.ok().put("page", page);
  34. }
  35. /**
  36. * 信息
  37. */
  38. @RequestMapping("/info/{${pk.attrname}}")
  39. //@RequiresPermissions("${moduleName}:${pathName}:info")
  40. public R info(@PathVariable("${pk.attrname}") ${pk.attrType} ${pk.attrname}){
  41. ${className}Entity ${classname} = ${classname}Service.getById(${pk.attrname});
  42. return R.ok().put("${classname}", ${classname});
  43. }
  44. /**
  45. * 保存
  46. */
  47. @RequestMapping("/save")
  48. //@RequiresPermissions("${moduleName}:${pathName}:save")
  49. public R save(@RequestBody ${className}Entity ${classname}){
  50. ${classname}Service.save(${classname});
  51. return R.ok();
  52. }
  53. /**
  54. * 修改
  55. */
  56. @RequestMapping("/update")
  57. //@RequiresPermissions("${moduleName}:${pathName}:update")
  58. public R update(@RequestBody ${className}Entity ${classname}){
  59. ${classname}Service.updateById(${classname});
  60. return R.ok();
  61. }
  62. /**
  63. * 删除
  64. */
  65. @RequestMapping("/delete")
  66. //@RequiresPermissions("${moduleName}:${pathName}:delete")
  67. public R delete(@RequestBody ${pk.attrType}[] ${pk.attrname}s){
  68. ${classname}Service.removeByIds(Arrays.asList(${pk.attrname}s));
  69. return R.ok();
  70. }
  71. }

5.4_ 启动renren-generator项目:

image.png

5.5_ 选择要生成的表,点击“生成代码”,同时生成前端与后端代码

image.png
image.png
image.png
image.png
image.png

(六) 修改zyg-common中依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-boot-starter</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.gitee.reger</groupId>
  8. <artifactId>spring-boot-starter-dubbo</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.apache.httpcomponents</groupId>
  12. <artifactId>httpclient</artifactId>
  13. <version>4.2.1</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.apache.httpcomponents</groupId>
  17. <artifactId>httpcore</artifactId>
  18. <version>4.2.1</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>commons-lang</groupId>
  22. <artifactId>commons-lang</artifactId>
  23. <version>2.6</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.apache.commons</groupId>
  27. <artifactId>commons-lang3</artifactId>
  28. </dependency>
  29. </dependencies>

(七) 复制renren-fast中的文件到zyg_common的com.zelin.utils包中

image.png

(八) 在zyg-pojo中引入依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.projectlombok</groupId>
  4. <artifactId>lombok</artifactId>
  5. <version>1.18.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>jakarta.persistence</groupId>
  9. <artifactId>jakarta.persistence-api</artifactId>
  10. <version>2.2.3</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.zelin</groupId>
  14. <artifactId>zyg-common</artifactId>
  15. <version>2.0</version>
  16. </dependency>
  17. </dependencies>

(九) 在zyg-sellergoods-interface中引入依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.zelin</groupId>
  4. <artifactId>zyg-pojo</artifactId>
  5. <version>2.0</version>
  6. </dependency>
  7. </dependencies>

(十) 在zyg-sellergoods-service中引入依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.zelin</groupId>
  8. <artifactId>zyg-sellergoods-interface</artifactId>
  9. <version>2.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.zelin</groupId>
  13. <artifactId>zyg-dao</artifactId>
  14. <version>2.0</version>
  15. </dependency>
  16. </dependencies>

(十一) 在zyg-manager-web中引入依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.zelin</groupId>
  8. <artifactId>zyg-sellergoods-service</artifactId>
  9. <version>2.0</version>
  10. </dependency>
  11. </dependencies>

(十二) 在zyg-dao中引入依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.alibaba</groupId>
  12. <artifactId>druid-spring-boot-starter</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>com.zelin</groupId>
  16. <artifactId>zyg-pojo</artifactId>
  17. <version>2.0</version>
  18. </dependency>
  19. </dependencies>

(十三) 在zyg-dao中添加配置文件:

  1. /**
  2. * 功能: 配置分页插件
  3. * 参数:
  4. * 返回值:
  5. * 时间: 2021/7/23 15:13
  6. */
  7. @Configuration
  8. @MapperScan("com.zelin.dao")
  9. public class MybatisPlusConfig {
  10. // 最新版(配置分页插件)
  11. @Bean
  12. public MybatisPlusInterceptor mybatisPlusInterceptorPage() {
  13. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  14. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
  15. return interceptor;
  16. }
  17. // 配置乐观锁
  18. @Bean
  19. public MybatisPlusInterceptor mybatisPlusInterceptorLock() {
  20. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  21. interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  22. return interceptor;
  23. }
  24. }
  1. @Configuration
  2. @PropertySource("classpath:jdbc.properties") //读取指定配置文件 不指定默认读取:application.properties或application.yml文件
  3. public class MyDataSourceConfig {
  4. //下面将jdbc.properties文件中的jdbc前缀去掉后,得到的key作为dataSouce的属性进行匹配并将配置文件中的值注入到dataSource属性中
  5. @Bean
  6. @ConfigurationProperties(prefix = "jdbc")
  7. public DataSource druidDataSource(){
  8. DruidDataSource dataSource = new DruidDataSource();
  9. return dataSource;
  10. }
  11. }

(十四) 将上面生成的资源放到后端项目

image.png
image.png
image.png
image.png
image.png
image.png

(十五) 将上面生成的资源放到前端项目

image.png

(十六) 在前端的项目:系统管理->菜单管理,创建菜单

image.png

16.1_ 创建完成如下图所示:

image.png

16.2_ 这两个菜单在数据库表sys_menu中的记录如下:

image.png

16.3_ 这两个菜单在数据库表sys_menu中的记录如下:

image.png
brand_menu.sql内容如下:
image.png
最终页面效果如下:
image.png

(十七) 修改前端config/index.js文件,添加内容

  1. module.exports = {
  2. dev: {
  3. // Paths
  4. assetsSubDirectory: 'static',
  5. assetsPublicPath: '/',
  6. // 代理列表, 是否开启代理通过[./dev.env.js]配置
  7. proxyTable: devEnv.OPEN_PROXY === false ? {} : {
  8. '/proxyApi': {
  9. target: 'http://zeyigou.com',
  10. changeOrigin: true,
  11. pathRewrite: {
  12. '^/proxyApi': '/'
  13. }
  14. }
  15. },
  16. hot:true, //加上这句才会进行热启动
  17. ...
  18. }

(十八) 修改config/dev.env.js文件

  1. module.exports = merge(prodEnv, {
  2. NODE_ENV: '"development"',
  3. OPEN_PROXY: true // 是否开启代理, 重置后需重启vue-cli
  4. })

此时,追踪源码src/utils/httpRequest.js文件,可以看到如下代码:

  1. /**
  2. * 请求地址处理
  3. * @param {*} actionName action方法名称
  4. */
  5. http.adornUrl = (actionName) => {
  6. // 非生产环境 && 开启代理, 接口前缀统一使用[/proxyApi/]前缀做代理拦截!
  7. return (process.env.NODE_ENV !== 'production' && process.env.OPEN_PROXY ? '/proxyApi/' : window.SITE_CONFIG.baseUrl) + actionName
  8. }

分析: 1、可以看到,此时会在每个请求前添加:/proxyApi 前缀 2、查看 config/index.js文件中的路由表可知,此时页面会自动跳转到http://zeyigou.com页面.

(十九) 修改linux中的nginx配置(处理跨域请求)

19.1_ 分析nginx的目录结构:

image.png
image.png
下面是conf/nginx.conf文件内容,引入了我们自定义的配置文件:
image.png
添加我们自定义的配置文件conf/conf.d/zeyigou.conf,内容如下:

  1. server {
  2. listen 80;
  3. server_name zeyigou.com;
  4. location / {
  5. proxy_pass http://192.168.56.1:8080/renren-fast/;
  6. proxy_set_header Host $host;
  7. }
  8. location /manager {
  9. proxy_pass http://192.168.56.1:9001/;
  10. proxy_set_header Host $host;
  11. }
  12. }

说明: 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服务器:

  1. docker restart nginx

19.3_ 前后端开发中的跨域流程及原理分析【时序图】:

image.png

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

image.png

上述问题,也可以在生成实体类时,修改renren-generator的generator.properties文件中关于类型的定义。 问题原因:前端得到的number类型只支持到16位精度,而idworker生成的id为19位精度,所以会丢失精度! image.png 重点强调:因为String类型的查询效率比基本类型要低,所以,我们可以在zyg-dao中添加一个配置文件,将根据雪花算法得到id在后端转换为String送到前端显示! JacksonConfig.java内容如下:

  1. @Configuration
  2. public class JacksonConfig {
  3. @Bean
  4. @Primary
  5. @ConditionalOnMissingBean(ObjectMapper.class)
  6. public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
  7. {
  8. ObjectMapper objectMapper = builder.createXmlMapper(false).build();
  9. // 全局配置序列化返回 JSON 处理
  10. SimpleModule simpleModule = new SimpleModule();
  11. //JSON Long ==> String(前后端Long类型传到前端转成字符串)
  12. simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
  13. objectMapper.registerModule(simpleModule);
  14. return objectMapper;
  15. }
  16. }

(二十一) 最终品牌模块显示效果如下:

image.png

(二十二) 用与前面同样的方法添加商品管理的其它模块:

image.png

(二十三)项目最终运行效果如下:

image.png

(二十四) docker环境下安装zookeeper:

24.1 命令:

  1. mkdir -p /mydata/zookeeper/conf
  2. mkdir -p /mydata/zookeeper/data
  3. cd /mydata
  4. chmod -R 777 zookeeper
  5. docker run --name zk --privileged=true -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart always -d -v $(pwd)/conf:/conf zookeeper
  6. 进入zoo.cfg文件,修改data目录位置:/mydata/zookeeper/data

24.2 步骤:

  1. 0、创建/mydata/zookeeper/conf /mydata/zookeeper/data 两个目录。
  2. 1、切到/mydata/目录,执行:chmod -R 777 zookeeper
  3. 2、再执行命令:
  4. docker run --name zk --privileged=true -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart always -d -v $(pwd)/conf:/conf zookeeper
  5. 3、进入zoo.cfg文件,修改data目录位置:
  6. /mydata/zookeeper/data

24.3 zookeeper客户端的常用命令:

  1. //1. 进入docker中的zk容器
  2. dokcer exec -it zk /bin/bash
  3. //2. 进到客户端
  4. cd bin
  5. ./zkCli.sh
  6. //3. 查看zookeeper中所有节点
  7. ls /dubbo
  8. //查看到dubbo节点中如下的子节点:【下面是查看到的结果】
  9. [com.zelin.content.service.ContentService, com.zelin.sellergoods.service.BrandService, com.zelin.service.StudentService]