preface

基于 BladeX 文档的补充,记录自己做项目的过程

前端代码: http://bitbucket.baige.cloud:7990/projects/BGCLOUD/repos/aid-ui/browse
后端代码: http://bitbucket.baige.cloud:7990/projects/BGCLOUD/repos/aid-server/browse
文档地址: http://git.baige.cloud:31000/sbin/Bladex_Doc

组织架构管理 流程 (This link expires on ->> Oct 31)

chapter 1

Maven
MySQL
SSM + SpringBoot
MyBatisPlus
Lombok
Swagger

chapter 2

第一个 API

新建 Controller -> org.springblade.Controller.DemoController

@RestController
@RequestMapping("api")
public class DemoController {

    @GetMapping("hello")
    public String hello(String name) {
        return "Hello, " + name;
    }
}

启动项目,GET 请求 http://localhost:81/api/hello?name=yaoyao_qiekn,返回如下结果

{
    "code": 401,
    "success": false,
    "data": null,
    "msg": "请求未授权"
}

这里因为未授权的请求无法调用受保护的API,需要进行API鉴权

package org.springblade.modules.auth.endpoint;

@RequestMapping(AppConstant.APPLICATION_AUTH_NAME)
@Api(value = "用户授权认证", tags = "授权接口")
public class BladeTokenEndPoint {

	private final BladeRedis bladeRedis;
	private final JwtProperties jwtProperties;

	@ApiLog("登录用户验证")
	@PostMapping("/oauth/token")
    ...

}

- - - - - - - - - - - - - - - - - - - - - - -

package org.springblade.core.launch.constant;

public interface AppConstant {
    ...

    String APPLICATION_AUTH_NAME = "blade-auth";
    ...
}

通过看 controller 源码,确定认证的接口地址是 /blade-auth/oauth/token,按照文档提示在 postman 设置 HeadersBody

  • Headers
Key Value
Authorization Basic c2FiZXI6c2FiZXJfc2VjcmV0
Tenant-Id 000000

Authorization的值是blade_client表的client_idclient_secret字段组合后转换成的Base64编码。
e.g. saber:saber_secret → base64

  • Body
Key Value
grant_type password
username admin
password 21232f297a57a5a743894a0e4a801fc3
scope all
tenantId 000000

框架对密码进行了二次加密,由前端调用传参需要现将原密码进行md5加密后再进行传递
原密码是admin,所以md5加密后是21232f297a57a5a743894a0e4a801fc3

postman POST 请求,拿到返回结果

{
    "tenant_id": "000000",
    "user_id": "1123598821738675201",
    "dept_id": "1123598813738675201",
    "post_id": "1123598817738675201",
    "role_id": "1123598816738675201",
    "oauth_id": "",
    "account": "admin",
    "user_name": "admin",
    "nick_name": "管理员",
    "real_name": "管理员",
    "role_name": "administrator",
    "avatar": "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png",
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJpc3N1c2VyIiwiYXVkIjoiYXVkaWVuY2UiLCJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJ1c2VyX25hbWUiOiJhZG1pbiIsInJlYWxfbmFtZSI6IueuoeeQhuWRmCIsInRva2VuX3R5cGUiOiJhY2Nlc3NfdG9rZW4iLCJyb2xlX25hbWUiOiJhZG1pbmlzdHJhdG9yIiwicG9zdF9pZCI6IjExMjM1OTg4MTc3Mzg2NzUyMDEiLCJ1c2VyX2lkIjoiMTEyMzU5ODgyMTczODY3NTIwMSIsInJvbGVfaWQiOiIxMTIzNTk4ODE2NzM4Njc1MjAxIiwibmlja19uYW1lIjoi566h55CG5ZGYIiwiZGV0YWlsIjp7InR5cGUiOiJ3ZWIifSwiZGVwdF9pZCI6IjExMjM1OTg4MTM3Mzg2NzUyMDEiLCJhY2NvdW50IjoiYWRtaW4iLCJjbGllbnRfaWQiOiJzYWJlciIsImV4cCI6MTY5MzgyNjQ0MCwibmJmIjoxNjkzODIyODQwfQ.N8hj-qWqEisGqHM6kDdE0O1r8eCY3d69B3AUrxZ91AM",
    "refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJpc3N1c2VyIiwiYXVkIjoiYXVkaWVuY2UiLCJ1c2VyX2lkIjoiMTEyMzU5ODgyMTczODY3NTIwMSIsInJvbGVfaWQiOiIxMTIzNTk4ODE2NzM4Njc1MjAxIiwidG9rZW5fdHlwZSI6InJlZnJlc2hfdG9rZW4iLCJkZXB0X2lkIjoiMTEyMzU5ODgxMzczODY3NTIwMSIsImNsaWVudF9pZCI6InNhYmVyIiwiZXhwIjoxNjk0NDI3NjQwLCJuYmYiOjE2OTM4MjI4NDB9.eD9GUCBbtq634qgseRaUevFVyY95m1YGoB2ypBdOX-c",
    "token_type": "bearer",
    "expires_in": 3600,
    "detail": {
        "type": "web"
    },
    "license": "powered by bladex"
}

回到第一个API上,Headers
1 设置请求头为Blade-Auth,请求头对应的值为 tokenType + ' ' + accessToken (就是中间用一个空格隔开)
2 设置请求头为 Authorization 值为 Basic 21232f297a57a5a743894a0e4a801fc3,这个和上面的 base64 一样

GET 方法测试第一个API http://localhost:81/hello/hello?name=yaoyao_qiekn

Hello, yaoyao_qiekn

Yeah! cpper 第一次写Java后端,迈出的第一小步。

2023-09-04 19:03:12

第一个CRUD

结合框架已有的结构,选一个最简单的岗位管理,看一下怎删改查是如何实现的

来看岗位表 -> aid-server/src/main/java/org/springblade/modules/system/controller/PostController.java

1° 一些小问题 想要在本地部署,用本地的 MySQL 和 Redis,所以写了 application-local.yml,但是发现在 application.yml 中配置 spring.profiles.local 没有效果

spring:
    profies:
        local

源码中看到这里

https://blog.csdn.net/abcdefghqqcxz/article/details/126428279

这里是只读,新添加文件行不通了。看了一下 application-test.yml 正好是 MySQL Redis 配置的都是本地,那就顺从这个吧~

开始大刀阔斧修改

组织架构部分

本地测试

数据表设计

项目原始数据表

本地数据库中重新设计数据表如下
[等待商讨]

数据库修改 Ver1.0

-- 用户、部门、公司、集团、角色表
create table yaogl_demo_user
(
    ID          bigint                       not null comment '主键'
        primary key,
    parent_id   bigint      default 0        null comment '父主键',
    tenant_id   varchar(12) default '000000' null comment '租户id',
    user_type   int                          null comment '用户平台',
    code        varchar(12)                  null comment '用户编号',
    account     varchar(45)                  null comment '账号',
    password    varchar(45)                  null comment '密码',
    name        varchar(20)                  null comment '昵称',
    real_name   varchar(10)                  null comment '姓名',
    avatar      varchar(500)                 null comment '头像',
    email       varchar(45)                  null comment '邮箱',
    phone       varchar(45)                  null comment '手机号码',
    birthday    datetime                     null comment '生日',
    sex         int                          null comment '性别',
    role_id     varchar(1000)                null comment '角色id',
    dept_id     varchar(1000)                null comment '部门id',
    company_id  varchar(1000)                null comment '公司ID',
    group_id    varchar(1000)                null comment '集团ID',
    create_user bigint                       null comment '创建人',
    create_dept bigint                       null comment '创建部门',
    create_time datetime                     null comment '创建时间',
    update_user bigint                       null comment '修改人',
    update_time datetime                     null comment '修改时间',
    status      int                          null comment '状态',
    is_deleted  int         default 0        null comment '是否已删除'
)
    comment '用户表' collate = utf8mb4_general_ci;

create table yaogl_demo_dept
(
    ID          bigint                        not null comment '主键'
        primary key,
    dept_id     bigint       default 0        null comment '部门id',
    dept_name   varchar(255) default '0'      null comment '部门名称',
    parent_id   bigint       default 0        null comment '父主键',
    company_id  bigint       default 0        null comment '所属公司id',
    create_user varchar(255)                  null comment '创建人',
    create_time datetime                      null comment '创建时间',
    update_user varchar(255)                  null comment '修改人',
    update_time datetime                      null comment '修改时间',
    is_deleted  int                           null comment '是否已删除',
    create_dept bigint                        null comment '创建部门',
    status      int                           null comment '状态',
    tenant_id   varchar(12)  default '000000' null comment '租户id',
    code        varchar(12)                   null comment '用户编号'
)
    comment '部门表' collate = utf8mb4_general_ci;

create table yaogl_demo_company
(
    ID           bigint                        not null comment '主键'
        primary key,
    tenant_id    varchar(12)  default '000000' null comment '租户id',
    code         varchar(12)                   null comment '用户编号',
    company_id   bigint       default 0        null comment '公司id',
    company_name varchar(255) default '0'      null comment '公司名称',
    group_id     bigint                        null comment '所属集团id',
    create_user  varchar(255)                  null comment '创建人',
    create_dept  bigint                        null comment '创建部门',
    create_time  datetime                      null comment '创建时间',
    update_user  varchar(255)                  null comment '修改人',
    update_time  datetime                      null comment '修改时间',
    status       int                           null comment '状态',
    is_deleted   int          default 0        null comment '是否已删除'
)
    comment '公司表' collate = utf8mb4_general_ci;

create table yaogl_demo_group
(
    ID          bigint                        not null comment '主键'
        primary key,
    group_id    bigint       default 0        null comment '集团id',
    group_name  varchar(255) default '0'      null comment '集团名称',
    create_user varchar(255)                  null comment '创建人',
    create_time datetime                      null comment '创建时间',
    update_user varchar(255)                  null comment '修改人',
    update_time datetime                      null comment '修改时间',
    is_deleted  int          default 0        null comment '是否已删除',
    create_dept bigint                        null comment '创建部门',
    status      int                           null comment '状态',
    tenant_id   varchar(12)  default '000000' null comment '租户id',
    code        varchar(12)                   null comment '用户编号'
)
    comment '集团表' collate = utf8mb4_general_ci;

create table yaogl_demo_role
(
    ID          bigint                       not null comment '主键'
        primary key,
    tenant_id   varchar(12) default '000000' null comment '租户ID',
    code        varchar(12)                  null comment '用户编号',
    parent_id   bigint      default 0        null comment '父主键',
    role_name   varchar(255)                 null comment '角色名',
    role_alias  varchar(255)                 null comment '角色别名',
    sort        int                          null comment '排序',
    is_deleted  int         default 0        null comment '是否已删除',
    create_user varchar(255)                 null comment '创建人',
    create_dept bigint                       null comment '创建部门',
    create_time datetime                     null comment '创建时间',
    update_user varchar(255)                 null comment '修改人',
    update_time varchar(255)                 null comment '修改时间',
    status      int                          null comment '状态'
)
    comment '角色表' collate = utf8mb4_general_ci;

-- 中间表
create table yaogl_demo_user_role
(
    ID      bigint           not null comment '主键'
        primary key,
    user_id bigint default 0 null comment '用户id',
    dept_id bigint default 0 null comment '角色id'
)
    comment '用户角色表' collate = utf8mb4_general_ci;

create table yaogl_demo_user_dept
(
    ID      bigint           not null comment '主键'
        primary key,
    user_id bigint default 0 null comment '用户id',
    dept_id bigint default 0 null comment '部门id'
)
    comment '用户部门中间表' collate = utf8mb4_general_ci;

代码生成

首先配置数据源,然后在数据模型设计中添加对应的物理表,进行模型匹配

这里首先注意包名,其次后端生成路径是写项目根路径。

例如: 包名 org.springblade.demostructure
后端生成路径 /User/leoua7/Projects/SAAS-AI/pigeon/aid-server
前端生成路径 /User/leoua7/Projects/SAAS-AI/pigeon/aid-ui

查验效果

运行自动生成的 sql 文件,重启前后端项目。查看效果, 在默认sql语句执行后会是在 工作台目录下。
我额外修改了菜单路径和图标 在数据表blade_menu

-- 菜单表

-- custom
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743370855919616', 0, 'demoUser', '用户表', 'menu', '/demostructure/demoUser', 'iconfont iconicon_subordinate', 1, 1, 0, 1, NULL, 0);

-- user
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743370855919617', 1699743370855919616, 'demoUser', '用户表', 'menu', '/demostructure/demoUser','iconfont iconicon_principal' , 1, 1, 0, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743370855919618', '1699743370855919617', 'demoUser_add', '新增', 'add', '/demostructure/demoUser/add', 'plus', 1, 2, 1, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743370855919619', '1699743370855919617', 'demoUser_edit', '修改', 'edit', '/demostructure/demoUser/edit', 'form', 2, 2, 2, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743370855919620', '1699743370855919617', 'demoUser_delete', '删除', 'delete', '/api/blade-demoUser/demoUser/remove', 'delete', 3, 2, 3, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743370855919621', '1699743370855919617', 'demoUser_view', '查看', 'view', '/demostructure/demoUser/view', 'file-text', 4, 2, 2, 1, NULL, 0);

-- dept
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371346653185', 1699743370855919616, 'demoDept', '部门表', 'menu', '/demostructure/demoDept','iconfont iconicon_principal' , 1, 1, 0, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371346653186', '1699743371346653185', 'demoDept_add', '新增', 'add', '/demostructure/demoDept/add', 'plus', 1, 2, 1, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371346653187', '1699743371346653185', 'demoDept_edit', '修改', 'edit', '/demostructure/demoDept/edit', 'form', 2, 2, 2, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371346653188', '1699743371346653185', 'demoDept_delete', '删除', 'delete', '/api/blade-demoUser/demoDept/remove', 'delete', 3, 2, 3, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371346653189', '1699743371346653185', 'demoDept_view', '查看', 'view', '/demostructure/demoDept/view', 'file-text', 4, 2, 2, 1, NULL, 0);


-- group
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371728334849', 1699743370855919616, 'demoCompany', '公司表', 'menu', '/demostructure/demoCompany','iconfont iconicon_group' , 1, 1, 0, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371728334850', '1699743371728334849', 'demoCompany_add', '新增', 'add', '/demostructure/demoCompany/add', 'plus', 1, 2, 1, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371728334851', '1699743371728334849', 'demoCompany_edit', '修改', 'edit', '/demostructure/demoCompany/edit', 'form', 2, 2, 2, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371728334852', '1699743371728334849', 'demoCompany_delete', '删除', 'delete', '/api/blade-demoUser/demoCompany/remove', 'delete', 3, 2, 3, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371728334853', '1699743371728334849', 'demoCompany_view', '查看', 'view', '/demostructure/demoCompany/view', 'file-text', 4, 2, 2, 1, NULL, 0);

-- company
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371975798785', 1699743370855919616, 'demoGroup', '集团表', 'menu', '/demostructure/demoGroup','iconfont iconicon_boss' , 1, 1, 0, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371975798786', '1699743371975798785', 'demoGroup_add', '新增', 'add', '/demostructure/demoGroup/add', 'plus', 1, 2, 1, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371975798787', '1699743371975798785', 'demoGroup_edit', '修改', 'edit', '/demostructure/demoGroup/edit', 'form', 2, 2, 2, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371975798788', '1699743371975798785', 'demoGroup_delete', '删除', 'delete', '/api/blade-demoUser/demoGroup/remove', 'delete', 3, 2, 3, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699743371975798789', '1699743371975798785', 'demoGroup_view', '查看', 'view', '/demostructure/demoGroup/view', 'file-text', 4, 2, 2, 1, NULL, 0);

-- role
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699748302686322689', 1699743370855919616, 'demoRole', '角色表', 'menu', '/demostructure/demoRole','iconfont iconicon_boss' , 1, 1, 0, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699748302686322690', '1699748302686322689', 'demoRole_add', '新增', 'add', '/demostructure/demoRole/add', 'plus', 1, 2, 1, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699748302686322691', '1699748302686322689', 'demoRole_edit', '修改', 'edit', '/demostructure/demoRole/edit', 'form', 2, 2, 2, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699748302686322692', '1699748302686322689', 'demoRole_delete', '删除', 'delete', '/api/blade-demoUser/demoRole/remove', 'delete', 3, 2, 3, 1, NULL, 0);
INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
VALUES ('1699748302686322693', '1699748302686322689', 'demoRole_view', '查看', 'view', '/demostructure/demoRole/view', 'file-text', 4, 2, 2, 1, NULL, 0);