# 后端脚手架
基于使用技术中台提供的后端脚手架,完全基于三和中台2.X底层架构,本地无用户体系,通过中台基础服务授权登录,融入中台2.X搭建的建协云的开发思路,是一个集中式的后端框架,允许通过简易开发扩展为分布式后端或微服务后端。 本章节主要讲述在IntelliJ idea搭建本架构的开发环境并运行使用,以及各模块代码作用。
# 应用技术
# 技术栈
- 项目管理工具:maven
- 语言:java8
- 基础框架:spring boot 2.3.12.RELEASE
- 父类框架:com.hhh.cloud.framework 2.1.0-SNAPSHOT
- 数据库:mysql、oracle
- 缓存数据:redis
- 数据持久层:mybatis、mybatis-plus
- 服务注册与配置管理:nacos
# 框架

# 工具封装
| 工具 | 说明 |
|---|---|
| hhh-util | 中台基础工具包 |
| hhh-redis | redis工具包 |
- hhh-util
工具包包含:base、加密、枚举、异常项、拦截器、http、反参、常用工具、其他工具等模块。
BaseBean可以作为所有对象的基类,改造了toString()方法,使对象返回jsonString。
PageBean列表查询条件对象可以使用,里面包含行数limit和页码page参数,使用mybatis-plus时可以更方便,无需每个对象都增加这两个参数。
TreeBean树形结构对象,可以提供给需要封装树形结构的数据结构使用。
AuthHelper:spring security加密算法,没使用意义
CookieUtil:cookie读写工具(我也不知道为什么会被放在这里)
EscapeUtil:字符串编码转义工具
JasyptUtil:JasyptUtil加密算法
MD5Util:MD5加密算法
RSAUtil:RSA加密算法
SHA1Util:SHA1加密算法
HttpRequest:包含了GET、POST、JSONObjectPOST、POSTClazz请求方法
Result:普通反参,和前端脚手架配置使用
TableResult:列表反参,和前端脚手架配置使用。
- hhh-redis
如果开发者未接触过redis,可阅读基础教程 (opens new window)。 只要项目需要使用“redis”,就可以引用该hhh-redis,脚手架的登录认证缓存使用到该工具。
hhh-redis提供了RedisMapper核心工具类,里面包含了对redis常用的增删改查api。
引用:
@Autowired
private RedisMapper redisMapper;
接口:
/**
* 保存或更新数据(永久)
*/
public void insertOrUpdate(String key, Serializable value);
/**
* 保存或更新数据(按秒设置有效期)
*/
public void insertOrUpdateBySeconds(String key, Serializable value, long seconds);
/**
* 精确读取数据
*/
public Object select(String key);
/**
* 模糊匹配key,并返回匹配的key集合
*/
public Set<String> list(String pattern);
/**
* 删除一条数据
*/
public boolean remove(String key);
/**
* 查询数据是否存在
*/
public boolean exist(String key);
/**
* 查询数据剩余有效期时间(秒)
*/
public Long getExpire(String key);
# 服务环境准备
| 环境 | 说明 |
|---|---|
| 数据库 | mysql、oracle等,根据数据库自行引用数据库驱动 |
| redis | 缓存用户信息用到 |
| jdk8 | - |
# 基础属性配置
- 不使用nacos
- 打开项目中的resources/application.properties
- 配置以下信息:
spring.application.name=服务名
server.port=端口
spring.datasource.driver-class-name=数据库驱动
spring.datasource.url=数据库连接
spring.datasource.username=数据库账号
spring.datasource.password=数据库密码
spring.redis.host=redis访问地址
spring.redis.database=redis库序号
spring.redis.port=redis端口
spring.redis.password=redis认证密码
megrez.bridge.client.agent-id=应用id(开发前准备有提到)
megrez.bridge.client.agent-secret=应用秘钥(开发前准备有提到)
megrez.bridge.client.server-path=开放接口(开发前准备有提到)
megrez.bridge.client.cors-filter-exclude-path=允许前端跨域访问的地址,多个就用“,”隔开
- 使用nacos
- 将pom.xml文件以下引用删除
<dependency>
<groupId>com.hhh.cloud.framework</groupId>
<artifactId>megrez-spring-boot-starter</artifactId>
<version>${megrez-spring-boot-starter.version}</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</exclusion>
<exclusion>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 1. 如果不使用nacos,忽略nacos-配置管理功能依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${ali-nacos.version}</version>
<scope>test</scope>
</dependency>
<!-- 2. 如果不使用nacos,nacos-服务发现功能依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${ali-nacos.version}</version>
<scope>test</scope>
</dependency>
- 增加引用
<dependency>
<groupId>com.hhh.cloud.framework</groupId>
<artifactId>megrez-spring-boot-starter</artifactId>
<version>${megrez-spring-boot-starter.version}</version>
</dependency>
- 打开项目中的resources文件夹,新建bootstrap.properties
- bootstrap.porperties配置以下信息:
spring.application.name=服务名
spring.cloud.nacos.username=nacos认证账号
spring.cloud.nacos.password=nacos认证密码
#注册
spring.cloud.nacos.discovery.server-addr=nacos服务地址
#配置
spring.cloud.nacos.config.server-addr=nacos服务地址
- 登录nacos,在“配置管理”中新增配置,命名是bootstrap.properties上填写”spring.application.name“的值+”.properties“,如:hhh-megrez-bridge.properties。
- 删除application.properties下的”spring.application.name“配置,然后将所有配置复制到nacos的配置文件中。保存。
注:添加到nacos可以扩展负载均衡。
# 日志管理
脚手架集成了日志采集工具,需要在数据库创建四个日志表。mysql脚本如下:
CREATE TABLE `sys_logs_run` (
`id` varchar(36) NOT NULL,
`log_type` int(1) NOT NULL COMMENT '日志类型。0:异常日志,1:正常日志,2:运行日志,3:登录日志,4接口日志',
`operate_time` datetime NOT NULL COMMENT '操作时间',
`operate_info` varchar(2000) DEFAULT NULL COMMENT '操作内容',
`log_src` varchar(1000) DEFAULT NULL COMMENT '触发路径,日志的代码处',
`time_spend` varchar(10) DEFAULT NULL COMMENT '耗时',
`service_name` varchar(100) DEFAULT NULL COMMENT '业务服务名称',
`login_name` varchar(50) DEFAULT NULL COMMENT '登录名',
`username` varchar(100) DEFAULT NULL COMMENT '用户名',
`ip` varchar(100) DEFAULT NULL COMMENT 'ip',
`operate_name` varchar(100) DEFAULT NULL,
`result` varchar(255) DEFAULT NULL COMMENT '结果(成功/失败)',
`code` int(11) DEFAULT NULL COMMENT '状态码',
`msg` varchar(255) DEFAULT NULL COMMENT '结果信息',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `sys_logs_login` (
`id` varchar(36) NOT NULL,
`ip` varchar(19) DEFAULT NULL COMMENT '登录ip',
`login_time` datetime NOT NULL COMMENT '登录时间',
`login_name` varchar(255) DEFAULT NULL COMMENT '登录名',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`department` varchar(50) DEFAULT NULL COMMENT '所属部门',
`department_id` varchar(36) DEFAULT NULL COMMENT '所属部门主键',
`token` varchar(255) DEFAULT NULL COMMENT '登录凭证',
`login_result` varchar(2000) DEFAULT NULL COMMENT '登录结果',
`success_or_fail` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `sys_logs_data_edit` (
`id` varchar(36) NOT NULL,
`type` varchar(500) DEFAULT NULL COMMENT '业务类型/方法',
`before_data` varchar(2000) DEFAULT NULL COMMENT '修改前数据',
`ather_data` varchar(2000) DEFAULT NULL COMMENT '修改后数据',
`create_time` datetime NOT NULL COMMENT '创建爱你时间',
`login_name` varchar(50) DEFAULT NULL COMMENT '登录名',
`username` varchar(50) DEFAULT NULL COMMENT '用户名',
`service_name` varchar(100) DEFAULT NULL COMMENT '业务服务名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `sys_logs_business_error` (
`id` varchar(36) NOT NULL,
`type` varchar(500) DEFAULT NULL COMMENT '业务类型/方法',
`error_log` varchar(2000) DEFAULT NULL COMMENT '异常内容',
`error_data` varchar(2000) DEFAULT NULL COMMENT '异常数据',
`create_time` datetime NOT NULL COMMENT '创建时间',
`login_name` varchar(50) DEFAULT NULL COMMENT '登录名',
`username` varchar(50) DEFAULT NULL COMMENT '用户名',
`service_name` varchar(100) DEFAULT NULL COMMENT '业务服务名称',
`error_line` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 启动项目
运行BridgeApplication.java的main函数,就可以启动了。
# 打包发布
在项目根目录,使用maven命令行:mvn clean package -Dmaven.test.skip=true
# 授权信息
授权信息分为:用户信息、应用凭证、企业凭证。用户信息分配用户基本信息、权限信息、用户凭证。
# 获取登录用户
UserJwt user = UserContextHolder.get().getUserJwt();
// 包含用户信息如下:
private String id; //userId
private String loginName; //账号
private String personId; //待定pcPermissionMenu
private String name; //用户名称
private String gender; //性别
private String phone; //手机号
private String ucCode; //用户账号编码
private String duty; //职位
private String email;
private String userType; //账号类型//-1:超级管理员,0:企业账号,1企业人员账号
private Integer businessControl; //业务控制(全局控制页面显示多个 1 或者单个 0 监督机构信息)
private String entId; //单位ID
private String unifiedcode; //企业统一信用代码
private String entName; //企业名称
private String entAddress; //企业地址
private String unitType; //在应用中的企业类型
private String unitTypeCode; //在应用中的企业类型编号
private String deptId; //部门ID
private String deptName; //部门名称
private List<MenuTreeBean> pcPermissionMenu; //pc菜单权限
private List<String> permissionResources; //越权控制的权限,编号(code)集合
private Map<String, OrgClassBean> orgClassMap; //数据过滤
private String token; //token
private UnitBean unit; //用户当前企业
private List<UnitBean> unitBeans; //用户加入的企业
private String portrait; //头像
private List<String> roleCodes; //角色code集合
private String systemCode; //应用编码
private String categoryId; //四库单位类型
private String unitState; //企业状态 状态 0:审核中;1:审核通过 2:审核退回;3:已提交,企业信息未完善
private String categoryCode;
# 获取应用凭证
@Autowired
private ITokenService tokenService;
public void getTokenTest() {
String token = tokenService.getAgentToken();
}
# 获取企业凭证
企业凭证不会自动获取,需要开发者增加以下配置:
megrez.bridge.client.using-corp-token=true
megrez.bridge.client.corp-id=组织用户码
megrez.bridge.client.corp-secret=组织秘钥
获取方式:
@Autowired
private ITokenService tokenService;
public void getTokenTest() {
String token = tokenService.getCorpToken();
}