Skip to content

部署

接下来我们想把这个简单的 rbac 应用部署一下,可以选择提供免费应用的 PAAS 平台 heroku 和 vercel

在 heroku 创建应用和数据库

首先去 heroku(https://dashboard.heroku.com/) 进行注册,然后在管理面板可以创建应用,创建之后进入刚才创建的应用

  1. 点击 Resources 打开资源面板
  2. 点击 Find more add-ons 打开 选择页
  3. 找到 JawsDB MySQL 添加到我们的应用
  4. 打开 Settings ,找到 Config Vars ,点击 Reveal Config Vars 找到 MysqlUrl

这时候我们需要给这个数据库初始化一下,使用 Navicat 这种数据库工具尝试链接下上面提供的数据库 url

// 举例
mysql://67f6rq9wojcuv8x:1zs6r1lle45yp4h8j@acw2033ndw0at1t7.cbetxkdyhwsb.us-east-1.rds.amazonaws.com:3306/kbisf557lqvl80vy
mysql://username:password@host:part/database

格式提取出来之后就是:

host:acw2033ndw0at1t7.cbetxkdyhwsb.us-east-1.rds.amazonaws.com port:3306 username:67f6rq9wojcuv8x password:1zs6r1lle45yp4h8j

连接后可以使用下面的 sql 进行初始化,创建了一个具有 管理员角色的用户,一会要用这个用户进行登录~

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 80029
 Source Host           : localhost:3306
 Source Schema         : rbac

 Target Server Type    : MySQL
 Target Server Version : 80029
 File Encoding         : 65001

 Date: 01/07/2022 13:52:28
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for permission
-- ----------------------------
DROP TABLE IF EXISTS `permission`;
CREATE TABLE `permission` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `created_time` datetime(6) DEFAULT NULL,
  `description` text COLLATE utf8mb4_general_ci,
  `key_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `updated_time` datetime(6) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_msdul8rtcx152o541yv5gjik3` (`key_name`),
  UNIQUE KEY `UK_2ojme20jpga3r4r79tdso17gi` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- ----------------------------
-- Records of permission
-- ----------------------------
BEGIN;
INSERT INTO `permission` (`id`, `created_time`, `description`, `key_name`, `name`, `updated_time`) VALUES (1, '2022-06-16 13:56:21.500000', '管理的权限,属于这个系统的管理员才可以具有的权限', 'admin', '管理权限', '2022-06-16 13:56:21.500000');
COMMIT;

-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `created_time` datetime(6) DEFAULT NULL,
  `description` text COLLATE utf8mb4_general_ci,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `updated_time` datetime(6) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_8sewwnpamngi6b1dwaa88askk` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- ----------------------------
-- Records of role
-- ----------------------------
BEGIN;
INSERT INTO `role` (`id`, `created_time`, `description`, `name`, `updated_time`) VALUES (1, '2022-06-16 13:56:21.537000', '管理员角色,可以管理所有权限', '超级管理', '2022-06-16 13:56:21.537000');
COMMIT;

-- ----------------------------
-- Table structure for role_permissions
-- ----------------------------
DROP TABLE IF EXISTS `role_permissions`;
CREATE TABLE `role_permissions` (
  `roles_id` bigint NOT NULL,
  `permissions_id` bigint NOT NULL,
  PRIMARY KEY (`roles_id`,`permissions_id`),
  KEY `FKclluu29apreb6osx6ogt4qe16` (`permissions_id`),
  CONSTRAINT `FKclluu29apreb6osx6ogt4qe16` FOREIGN KEY (`permissions_id`) REFERENCES `permission` (`id`),
  CONSTRAINT `FKib3eov0359c5o9s0a913mtyvv` FOREIGN KEY (`roles_id`) REFERENCES `role` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- ----------------------------
-- Records of role_permissions
-- ----------------------------
BEGIN;
INSERT INTO `role_permissions` (`roles_id`, `permissions_id`) VALUES (1, 1);
COMMIT;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `created_time` datetime(6) DEFAULT NULL,
  `description` text COLLATE utf8mb4_general_ci,
  `nickname` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `updated_time` datetime(6) DEFAULT NULL,
  `username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_sb8bbouer5wak8vyiiy4pf2bx` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- ----------------------------
-- Records of user
-- ----------------------------
BEGIN;
INSERT INTO `user` (`id`, `created_time`, `description`, `nickname`, `password`, `updated_time`, `username`) VALUES (1, '2022-06-16 13:56:21.662000', '管理员帐户,可以管理其他用户u、角色和权限', '管理员', '$2a$10$Cyr6MGBq52qwBBmwoFHDp.67lM53sv05kUHFE7pUfGdZBrnUk.K5u', '2022-06-16 13:56:21.662000', 'admin');
COMMIT;

-- ----------------------------
-- Table structure for user_roles
-- ----------------------------
DROP TABLE IF EXISTS `user_roles`;
CREATE TABLE `user_roles` (
  `users_id` bigint NOT NULL,
  `roles_id` bigint NOT NULL,
  PRIMARY KEY (`users_id`,`roles_id`),
  KEY `FKj9553ass9uctjrmh0gkqsmv0d` (`roles_id`),
  CONSTRAINT `FK7ecyobaa59vxkxckg6t355l86` FOREIGN KEY (`users_id`) REFERENCES `user` (`id`),
  CONSTRAINT `FKj9553ass9uctjrmh0gkqsmv0d` FOREIGN KEY (`roles_id`) REFERENCES `role` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- ----------------------------
-- Records of user_roles
-- ----------------------------
BEGIN;
INSERT INTO `user_roles` (`users_id`, `roles_id`) VALUES (1, 1);
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

下一步需要准备我们项目中可以使用的 jdbc mysql url,在 Config Vars 添加下我们的参数: url:jdbc:mysql://23dw0at1t7.cbetxkdyhwsb.us-east-1.rds.amazonaws.com:3306/bbisf557lqvl80vy?reconnect=true&useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8 username:67f6rq9wojcuv8x password:1zs6r1lle45yp4h8j SPRING_PROFILES_ACTIVE:pro

在项目目录 src/main/resources 新建 application-pro.yml 文件,把数据库相关信息填上:

spring:
  datasource:
    url: ${url} # 这里的值存在heroku的环境变量中,可以通过环境变量获取
    username: ${username}
    password: ${password}
    driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动

上面写的参数就是我们设置到 Config Vars 的参数

部署应用

下面开始部署应用,首先在项目的根目录新建俩文件:system.propertiesProcfile ,这俩文件是 heroku 需要的配置:

// system.properties 这里声明我的运行时环境
java.runtime.version=11
// Procfile
web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/rbac-0.0.1-SNAPSHOT.jar

然后安装下 Heroku Cli,按照说明安装和登录

下一步是把整个项目推送到 heroku 我们建的应用下,在应用的 Settings 里面可以找到 Heroku git URL,我们登录成功后就可以添加我们的 git 远程仓库了git remote add origin https://git.heroku.com/boot-rbac.git,之后推送就行了

推送成功并且 build 成功后,尝试访问你的应用主页,在应用里面点击Open app 就行,这时候应该是会返回 503 错误,这时候打开应用的 Resources ,找到 Free Dynos ,点击右侧的编辑按钮,把应用打开后保存,如下图:

这时候再访问应用主页返回 {"code":201,"message":"未登录,请先登录","data":null}就代表应用正常跑起来了

在 vercel 部署前端

根据需要整了个前端项目,可以自行查看,对用来管理用户和测试权限相关

vercel注册和新建 project ,我直接使用我的 github 项目创建的,设置相关如图:

这里需要注意的就是,需要在前端项目新建个 vercel.json :

{
  "rewrites": [
    {
      "source": "/api/:match*",
      "destination": "https://boot-rbac.herokuapp.com/api/:match*"
    },
    {
      "source": "/(.*)",
      "destination": "/index.html"
    }
  ]
}

在线访问

部署成功后就可以访问了https://rbac-front.vercel.app,这属于前后端分离的方式部署的,自己有云服务的话,也可以利用 nginx 做反向代理

登录需要初始化的用户:

用户帐户密码
管理员adminpassword
普通用户normalpassword