sass-ai
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 设置 Headers
和 Body
- Headers
Key | Value |
---|---|
Authorization | Basic c2FiZXI6c2FiZXJfc2VjcmV0 |
Tenant-Id | 000000 |
Authorization
的值是blade_client
表的client_id
、client_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后端,迈出的第一小步。
第一个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 配置的都是本地,那就顺从这个吧~
开始大刀阔斧修改
组织架构部分
本地测试
数据表设计
本地数据库中重新设计数据表如下
[等待商讨]
-- 用户、部门、公司、集团、角色表
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);