# 后端脚手架

基于使用技术中台提供的后端脚手架,完全基于三和中台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

# 框架

![img](./img/admin_1.png "Image specified with width" =800x)

# 工具封装

工具 说明
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
  1. 打开项目中的resources/application.properties
  2. 配置以下信息:

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
  1. 将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>
  1. 增加引用
        <dependency>
            <groupId>com.hhh.cloud.framework</groupId>
            <artifactId>megrez-spring-boot-starter</artifactId>
            <version>${megrez-spring-boot-starter.version}</version>
        </dependency>
  1. 打开项目中的resources文件夹,新建bootstrap.properties
  2. 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服务地址

  1. 登录nacos,在“配置管理”中新增配置,命名是bootstrap.properties上填写”spring.application.name“的值+”.properties“,如:hhh-megrez-bridge.properties。
  2. 删除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();
}