# 项目开发手册-后端
# 版本更新
| 日期 | 版本 | 备注 |
|---|---|---|
| 新 2020-12-27 | 1.1-SNAPSHOT | 脚手架版本升级,修复底层框架若干漏洞,适应新的安全要求,详情查看代码下载 |
| 2020-10-21 | 1.0-SNAPSHOT | 属性配置增加获取角色配置,默认不获取,需要配置属性才能获取。当前只兼容建协云使用。用户信息(UserJwt)增加角色编号列roleCodes。 |
| 2020-08-26 | 1.0-SNAPSHOT | 属性配置增加app应用key和秘钥配置,嵌套应用(APP模式二)认证接口入参改动。 |
| 2020-08-10 | 1.0-SNAPSHOT | 中台2.0说明增加“9、基础数据过滤封装工具” |
| 2020-07-28 | 1.0-SNAPSHOT | 后端用户授权登录增加用户切换企业接口,前端使用方式请看前端,使用需要刷新maven。增加问题须知章节 |
| 2020-07-10 | 1.0-SNAPSHOT | 属性配置增加配置项,PC端改为自定义用户凭证,中台返回用户授权令牌,支持跨应用共享功能,使用需要刷新maven,同时升级前端 |
| 2020-05-26 | 1.0-SNAPSHOT | 增加获取自定义用户类示例,使用需要刷新maven |
| 2020-05-24 | 1.0-SNAPSHOT | 代码下载增加完整的前后端对接demo |
| 2020-05-20 | 1.0-SNAPSHOT | 用户类增加账号id、用户类型、(unitType)企业类型id,企业类型编号,需要刷新maven |
| 2020-05-19 | 1.0-SNAPSHOT | 属性配置增加配置项 |
| 2020-03-31 | 1.0-SNAPSHOT | 增加跨域过滤器启动可配置项;企业级凭证自定获取 |
| 2020-03-11 | 1.0-SNAPSHOT | 应用级凭证自动获取 |
| 2020-03-09 | 1.0-SNAPSHOT | 增加公共自定义校验api |
| 2020-03-03 | 1.0-SNAPSHOT | 增加自定义用户类实现方式 |
| 2020-02-03 | 1.0-SNAPSHOT | 支持接入建协云APP,授权APP登录 |
| 2020-01-18 | 1.0-SNAPSHOT | mongodb闭源管理 |
| 2020-01-15 | 1.0-SNAPSHOT | 增加mongodb(开源) |
| 2020-12-29 | 1.0-SNAPSHOT | 增加日志功能,附上日志表结构(mysql) |
| 2020-12-25 | 1.0-SNAPSHOT | 快速开始-属性配置说明更新,client-id和client-secret改为agent-id、agent-secret |
| 2020-12-21 | 1.0-SNAPSHOT | 快速开始-属性配置说明更新,增加user-permission-api属性 |
| 2020-12-15 | 1.0-SNAPSHOT | 授权登录源码闭源,保留demo代码 |
| 2020-12-11 | 1.0-SNAPSHOT | 开源 基于三和中台2.0授权登录,后端集中式开源架构版本,开发项目搭建环境说明 |
# 问题须知
1、megrez-util报缺少类错误时,请刷新maven,如果刷新maven不能解决,则把本地maven库的megrez-util包删除,重新获取。
2、框架源码以开发者中心发布的为最新,不再通过其他渠道发布。框架源码一般不会升级,但引用的底层架构会升级,每次底层升级刷新maven即可,请开发者们多留意版本更新日志。
# 简介
该文档是基于使用技术中台提供的后端基础框架“hhh-megrez-bridge”,完全基于三和中台2.0底层架构,本地无用户体系,通过建协云授权登录,融入中台2.0搭建的建协云的开发思路,是一个集中式的后端框架,允许通过简易开发扩展为分布式后端或微服务后端。
《手册》主要讲述在IntelliJ idea搭建本架构的开发环境并运行使用,以及各模块代码作用。
在拓展章节,会阐述如何使用nacos做分布式项目开发,jenkins、docker、rancher属于运维体系,非本《手册》讲述内容。
请开发者耐心看完开发文档,如有疑问,欢迎交流。
# 代码下载
点击下载项目源码
版本说明:
从2021-12-27发布版本开始,与2021-05-20版本分离。区别如下:
1、2021-12-27版本底层使用springboot2.3.12-RELEASE框架,兼容原使用springboot2.1.3版本的脚手架;
2、升级主要是修复旧版本众多的框架自带bug
3、未来将基于2021-12-27版本脚手架维护底层架构;旧版本不再升级功能,只对中台自研工具的漏洞进行修复,保证原有未升级新版本的项目稳定
4、请开发者尽快升级到2021-12-27版本,升级方法点这里。
| 发布日期 | 资源 |
|---|---|
| 2021-12-27 | 最新! hhh-megrez-bridge-v2.1.1-SNAPSHOT.rar |
| 2021-05-20 | hhh-megrez-bridge-v2.0.1-REALSE.rar |
| 很久以前 | hhh-megrez-bridge-v2.0.0-SNAPSHOT.rar |
代码生成器
| 发布日期 | 资源 |
|---|---|
| 2021-05-21 | 最新! hhh-generator.rar |
后端DEMO
| 发布日期 | 资源 |
|---|---|
| 2021-05-24 | 最新! admin-demo.rar |
# 应用技术
# 技术选型
- 项目管理工具:maven
- 运行环境:java 1.8.X
- 项目框架:springboot 2.1.3.RELEASE
- Parent项目:com.hhh.cloud.framework 2.0.0-SNAPSHOT
- 缓存数据库:redis
- 关系型数据库:mysql、oracle
- 非关系型数据库:mongodb
- 数据持久化:mybatis、mybatis-plus
# 技术框架

# 登录机制
采用建协云授权登录,授权登录采用主流的OAuth2.0技术。使用“hhh-megrez-bridge”框架,实现该过程是底层集成的,对于开发者是透明的,升级优化时是不影响正常业务的。

# 中台2.0
技术中台提供的“hhh-megrez-bridge”框架,是集成中台2.0“framework 2.0.0-SNAPSHOT”,已经依赖了以下开发工具:
| 工具 | 说明 |
|---|---|
| fastjson | 阿里的json封装工具 |
| nacos-config | 服务配置中心,hhh-megrez-bridge默认忽略,在pom.xml下去掉忽略代码即可使用 |
| nacos-discovery | 服务注册中心,hhh-megrez-bridge默认忽略,在pom.xml下去掉忽略代码即可使用 |
| openfeign | 声明web service客户端,让微服务之间调用如controller调用service一样简单 |
| lombok | 使用注解解决POJO的冗长代码,如getter、setter、toString等 |
| jasypt | 加密工具包 |
如果你需要使用以上工具,可以直接使用,不需要再引用了。
当然,中台2.0还集成了一些非必要的工具,并管理其版本,开发者可以选择性手动引用:
| 工具 | 说明 |
|---|---|
| hhh-auth-starter | 属于业务中台服务用户校验工具,第三方应用无需使用 |
| hhh-util | 中台2.0的工具包 |
| hhh-redis | redis使用工具包 |
| txlcn-tc、txlcn-txmsg-netty | 分布式事务管理工具 |
| oracle6 | oracle驱动 |
| shiro-spring | shiro认证,如第三方应用需要,可以使用 |
| kaptcha | 验证码工具 |
| mybatis-plus | 数据持久化工具,“hhh-megrez-bridge”默认选用 |
| pagehelper | 分页工具 |
| security-jwt | jwt认证工具 |
hhh-util和hhh-redis是常用的两个工具,推荐开发者优先使用hhh-util和hhh-redis封装的工具。
- hhh-redis
如果开发者未接触过redis,可阅读基础教程 (opens new window)。
只要项目需要使用“redis”,就可以引用该hhh-redis,“hhh-megrez-bridge”的登录认证缓存使用到该工具。
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 void insertOrUpdateByMinutes(String key, Serializable value, long minutes);
/**
* 保存或更新数据(按小时设置有效期)
*/
public void insertOrUpdateByHours(String key, Serializable value, long hours);
/**
* 保存或更新数据(按太难设置有效期)
*/
public void insertOrUpdateByDays(String key, Serializable value, long days);
/**
* 精确读取数据
*/
public Object select(String key);
/**
* 模糊匹配key,并返回匹配的key集合
*/
public Set<String> list(String pattern);
/**
* 删除一条数据
*/
public boolean remove(String key);
/**
* 删除多条数据
*/
public int removeAll(String... keys);
/**
* 查询数据是否存在
*/
public boolean exist(String key);
/**
* 查询数据剩余有效期时间(秒)
*/
public Long getExpire(String key);
/**
* 模糊查询列表数据
*/
public Map<String, Object> getParameter(List<Object> list);
- hhh-util
未来,技术中台会将与架构无关的小工具都会放入到该工具包中,供开发者使用。工具包目前包含:base、加密、枚举、异常项、拦截器、http、反参、常用工具、其他工具等模块。
1、base
base模块是javaBean类的可继承基类。包含:BaseBean、PageBean、TreeBean三个类。
* BaseBean可以作为所有对象的基类,改造了toString()方法,使对象返回jsonString。
* PageBean列表查询条件对象可以使用,里面包含行数limit和页码page参数,使用mybatis-plus时可以更方便,无需每个对象都增加这两个参数。
* TreeBean树形结构对象,可以提供给需要封装树形结构的数据结构使用。
2、加密工具
AuthHelper:spring security加密算法,没使用意义
CookieUtil:cookie读写工具(我也不知道为什么会被放在这里)
EscapeUtil:字符串编码转义工具
JasyptUtil:JasyptUtil加密算法
MD5Util:MD5加密算法
RSAUtil:RSA加密算法
SHA1Util:SHA1加密算法
3、枚举
枚举包括数据来源枚举、反参状态枚举。
CodeEnum:常用请求返回状态

OriginEnum:数据来源枚举项
4、异常类
AuthenticationException:认证失败异常,开发者无需理会。 BusinessException:功能逻辑异常,开发者开发的功能发现异常、数据和逻辑有误时,应该抛出该异常,架构会统一捕捉并返回结果给前端。 ForbiddenException:被禁止访问异常(401),开发者无需例会。
5、拦截器 FeignClientInterceptor:使用feign请求同集群的其他服务时,请求头不会同步,需要自行启动该拦截器,同步请求头。
6、http
HttpRequest:包含了GET、POST、JSONObjectPOST、POSTClazz请求方法。GET、POST请求返回String;JSONObjectPost返回JSON;POSTClazz返回用户指定的类(class)。
/**
* GET请求,返回String类型
*/
public static String GET(String url, HashMap<String, String> params);
/**
* GET请求,自定义请求字符编码,返回String类型
*/
public static String GET(String url, HashMap<String, String> params, String charse);
/**
* POST请求,application/json请求,入参为JSONObject
*/
public static String POST(String urlStr, JSONObject json);
/**
* POST请求,application/json请求,入参为JSONArray
*/
public static String POST(String urlStr, JSONArray json);
/**
* POST请求,入参为字符串,自定义请求字符编码
*/
public static String POST(String urlStr, StringBuffer stringBuffer, String contentType);
/**
* POST请求,反参为JSONObject
*/
public static JSONObject JSONObjectPOST(String url, JSONObject params);
/**
* POST请求,反参为自定义Class
*/
public static Object POSTClazz(String url, JSONObject params, Class clazz);
7、反参
为反参封装了Result、TableResult类,Result类用于返回普通请求,TableResult用于返回列表请求。
Result:中台2.0统一的请求返回结果类,参数包括:code、status、data、msg。
code和status是请求返回状态,是为了兼容一些旧项目。请求返回状态类型看“枚举项”。
TableResult:中台2.0统一的列表请求返回结果类,继承Result,参数除了Result的参数外,还有count,即查询的列表总数。

8、常用工具
CreateVerifyCode:图片验证码工具,不需要理会。
PropertyCopyUtils:对象值复制,类似BeantUtils.copyProperties。
StringRandom:生成随机字符串
UrlParamsUtil:获取一个url的入参
VerityUtils:数据规则验证,如手机号码、邮箱、身份证等等。
9、基础数据过滤封装工具 ClassFilterUtil:封装了根据中台授权的企业、跨企业、部门、跨部门、部门及下属部门、个人等条件返回封装好的查询条件入参——Map<String, Object>,或如使用mybatis-plus的QueryWrapper查询时,直接返回封装好的QueryWrapper给予开发者快速使用。 接口如下:
/**
* 继承参数数据过滤工具类
* @param params 过滤条件
*/
public static void getClssParams(Map<String,Object> params, String requestURI);
/**
* QueryWrapper封装过滤权限
* @param queryWrapper 查询条件
* @param params 入参(包含已经使用getClssParams返回的入参)
*/
public static void initClassQuery(QueryWrapper queryWrapper, Map<String,Object> params);
10、其他工具
CommonUtil:里面包含了各式各样的小工具,如:校验字符串是否为空、字符串转日期、随机字符串、Object转BigDecimal、生成GUID、获取请求参数、获取请求IP、Object转字符串等等。可以查阅技术中台相关文档。
# 快速开始
# 获取框架
请前往代码下载。
# 开发环境
推荐使用IntelliJ idea开发工具,如开发者未使用过,可阅读加载项目教程 (opens new window)。
打开后项目目录结构如下:

开发者拿到源码后,应当修改项目名,明确项目。
example模块是后端开发例子,可删除。
# 启动项目
BridgeApplication是启动类,测试时右键该类,选择Run或者Debug即可。
# 属性配置
- 第一步,找到属性配置文件“application.properties”。
- 第二步,配置redis访问。
- 第三步,授权登录配置。

可选配置属性说明:
| 属性 | 说明 |
|---|---|
| megrez.bridge.client.agent-id | 应用key,用户获取应用级token。 |
| megrez.bridge.client.agent-secret | 应用秘钥,用户获取应用级token。 |
| megrez.bridge.client.server-path | 中台后端访问地址。 |
| megrez.bridge.client.user-message-api | 用户中心授权返回code,根据code返回用户信息的api,默认是:/auth/auth/pcLogin。 |
| megrez.bridge.client.mobile-user-message-api | 移动APP授权后返回code,根据code返回用户信息的api,默认是:/api/sys-api/getUserInfoByCode |
| megrez.bridge.client.pc-allow-repeat | PC端登录是否允许重复登录,true为允许,false为不允许,默认是:true。 |
| megrez.bridge.client.pc-token-expire | PC端登录有效期,超期自动清理登录信息,需重新登录,单位是“秒”,默认值:1440。 |
| megrez.bridge.client.auth-exclude-path | 配置免登录接口,多个使用英文“,”隔开,可以使用匹配符“*”。 |
| megrez.bridge.client.authentication-path | 前端给后端传code的认证接口,如果需要自定义认证接口可自行配置,默认值:/authentication |
| megrez.bridge.client.cors-filter-exclude-path | 允许跨域配置项,前后端分离项目需要配置前端地址 |
| megrez.bridge.client.cors-filter | 默认:true。true为启动跨域过滤器,false为关闭。如果服务与前端交互还有一层网关,网关也做了跨域配置,那么当前服务应当关闭跨域过滤器,否则访问服务异常 |
| megrez.bridge.client.user-permission-api | 获取用户权限api,权限包括:菜单、数据过滤、api越权等。默认值:/auth/auth/sourceDetails |
| megrez.bridge.client.verify-service | 统一校验interface自定义实现类,封装通用的用户校验interface,满足前后端对接,需要用户继承interface并实现。详细查看《公共自定义校验api》 |
| megrez.bridge.client.user-detail-service | 自定义用户类获取方法,框架默认的用户信息不满足应用时,需要返回自定义用户类型。由用户实现interface。详细查看《自定义用户类》 |
| megrez.bridge.client.using-agent-token | 默认false。使用应用级凭证,即agentToken。 |
| megrez.bridge.client.agent-token-id | 默认agentToken。应用token存于redis唯一标识前缀(key) |
| megrez.bridge.client.user-token-id | 默认userToken。用户token存于redis唯一标识前缀(key) |
| megrez.bridge.client.corp-id | 企业key,即企业用户码,用于获取企业级token) |
| megrez.bridge.client.corp-secret | 企业秘钥,用于获取企业级token |
| megrez.bridge.client.corp-token-id | 缓存企业秘钥唯一标识 |
| megrez.bridge.client.using-corp-token | 默认false,true时自动获取企业级token |
| megrez.bridge.client.app-token-expire | 默认43200,APP端登录有效期 |
| megrez.bridge.client.access-token-id | 中台用户授权令牌唯一标识 |
| megrez.bridge.client.app-agent-id | APP的应用key,APP和PC端共用后端,并且APP使用模式二时使用 |
| megrez.bridge.client.app-agent-secret | App的应用,APP和PC端共用后端,并且APP使用模式二时使用 |
| 新 megrez.bridge.client.role-codes | 默认false,配置是否获取登录用户的角色,false不获取,true获取。 |
- 第四步,数据库配置(mybatis-plus配置mysql为例)。
#数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.169.0.226:3306/database?serverTimezone=GMT%2b8&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.hikari.maximum-pool-size=5
spring.datasource.hikari.minimum-idle=5
#mybatis-plus
mybatis-plus.mapper-locations=classpath*:mapper/**/*Mapper.xml
mybatis-plus.type-aliases-package=com.hhh.cloud.framework.concrete.**.entity
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#逻辑删除配置
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
#mybatis分页插件
pagehelper.reasonable=false
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql
pagehelper.row-bounds-with-count=true
# 后端用户授权登录
# 使用hhh-megrez-bridge框架
根据登录机制,后端需要提供“接收code”,并使用code获取用户信息和用户凭证token的认证接口。“hhh-megrez-bridge”提供了默认的认证接口:PC端“/authentication”和APP端“/authenticationMobile”。
- PC端“/authentication”实现
@PostMapping("authentication")
public Result<UserJwt> authentication(@RequestBody JSONObject data) throws AuthenticationException;
第一步:应用前端登录用户中心后,用户中心会回调前端地址并在url附带授权“code”,前端调用该认证接口将“code”传给后端,后端通过code获取用户信息和权限。前端具体步骤看中台2.1框架-网页端框架-3-5-认证接口配置
第二步:认证接口通过json接收code,使用code、agentId和agentSecret请求“http://m.jianxiecloud.com/auth/auth/pcLogin”接口,获取用户信息和token。
第三步:使用用户凭证token请求“http://m.jianxiecloud.com/auth/auth/sourceDetails?token=”接口,获取用户菜单、资源、数据过滤权限,并与用户信息合并。
第四步:将用户信息、权限、用户凭证token一并缓存到redis,作为登录认证凭据。
- APP端“/authenticationMobile”实现
该方法支持APP端模式一:
@PostMapping("authenticationMobile")
public Result<UserJwt> authenticationMobile(@RequestBody JSONObject data) throws AuthenticationException;
第一步:应用前端登录用户中心后,用户中心会回调前端地址并在url附带授权“code”,前端调用该认证接口将“code”传给后端,后端通过code获取用户信息和权限。前端具体步骤看中台2.1框架-网页端框架-3-5-认证接口配置
第二步:认证接口通过json接收code,使用code请求“http://m.jianxiecloud.com/api/sys-api/getUserInfoByCode?code=”接口,获取用户信息。
第三步:将用户信息、用户菜单、资源、数据过滤权限缓存到redis,作为登录认证凭据。
- APP模式二、应用互嵌,权限认证实现
@PostMapping("grantAuthentication")
public Result<Object> grantAuthentication(@RequestBody JSONObject data);
入参说明:
code: 前端页面地址url返回的code,或token。
agentType:值为“APP”时,代表APP模式二授权。配合配置管理的app-agent-id和app-agent-secret使用。
第一步:应用前端登录用户中心后,用户中心会回调前端地址并在url附带授权“code”,前端调用该认证接口将“code”传给后端,后端通过code获取用户信息和权限。前端具体步骤看中台2.1框架-网页端框架-3-5-认证接口配置
第二步:认证接口通过json接收code,使用code请求“http://m.jianxiecloud.com/system/login/getUISD”接口获取用户信息、用户菜单、资源、数据过滤权限。
第三步:将用户信息、用户菜单、资源、数据过滤权限缓存到redis,作为登录认证凭据。
应用互嵌具体方式移步中台2.1框架-网页端框架-4、iframe嵌入页面
- PC端,用户切换企业“/pcChangeComapny”实现
使用方法已整合到前端框架,无需开发者配置使用。
@PostMapping("pcChangeCompany")
public Result<Object> pcChangeCompany(@RequestBody JSONObject data) throws AuthenticationException;
第一步:传入unitId,接口请求中台校验,并返回切换后的用户信息和权限。
# 自定义框架
一些已有的或不使用hhh-megrez-bridge框架的项目,也拥有自己的用户体系,只需要实现建协云授权登录就满足要求,开发者需要于项目中实现授权登录。
PC端
第一步:校验用户是否已登录。 第二步:未登录时页面重定向到授权页面。授权页面连接:http://uc.3hmis.com/usercenter/oauth/authorize?response_type=code&client_id=client_id&redirect_uri=redirect_uri。
第三步:实现使用hhh-megrez-bridge中的PC端“/authentication”接口。APP端
第一步:前端接收code。
第二步:后端实现APP端“/authenticationMobile”。
详细文档可阅读建协云开放平台 (opens new window)的“网页端身份验证”和“移动端身份验证”。
# 用户类
hhh-megrez-bridge框架提供了方便的接口供开发者管理用户信息。
缓存的用户信息会封装在UserJwt类中。开发者可以在业务代码上使用UserContextHolder.get().getUserJwt()读取用户信息。
//默认使用UserJwt
UserJwt user = UserContextHolder.get().getUserJwt();
//自定义用户类,用户类必须集成UserJwt
UserDemo userDemo = (UserDemo) UserContextHolder.get().getUserJwtForCustom(UserDemo.class);
- 基础属性
private String id; //账号id
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 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集合
- 自定义属性值
当前用户类不满足应用要求,开发者需要根据项目实际情况,更改用户类里的属性值时,hhh-megrez-bridge框架提供了可继承的service接口让开发实现。开发可在实现接口方法中对获取到的用户信息进行自定义属性值修改。
第一步:编写Service实现类,实现接口IUserDetailService方法loadUserFromCustom。
- 自定义属性
如果仅改变属性值不满足需求,开发者可以自定义用户类并继承UserJwt,扩展所需的属性,在实现接口IUserDetailService方法loadUserFromCustom中返回自定义用户类。

注意:前后端架构只识别UserJwt原参数,不识别自定义参数;不建议扩展太多自定义参数。 - 实现接口IUserDetailService方法loadUserFromCustom。
实现该接口,需要开发者在属性配置中配置megrez.bridge.client.user-detail-service,值为实现类于spring的映射名。
megrez.bridge.client.user-detail-service=userDetailDemoServiceImpl
配置属性可阅读属性配置
# 获取应用凭证
应用凭证即agentToken,是使用应用的agentId和agentSecret请求“http://m.jxcloud.3hmis.com/api/sys-api/getAgentToken”获取的,详情阅读建协云开放平台>>获取应用凭证 (opens new window)。
agentToken用于调用开放平台提供的应用级api。
hhh-megrez-bridge框架中以及集成获取agentToken的方法,开发者可以配置属性megrez.bridge.client.using-agent-token开启,默认关闭。
megrez.bridge.client.using-agent-token=true
配置属性可阅读属性配置
- 使用agentToken 开发者请求开放平台接口时,调用ITokenService.getAgentToken()获取agentToken。
@Autowired
private ITokenService tokenService;
public void getTokenTest() {
String token = tokenService.getAgentToken();
}
# 获取企业凭证
企业凭证即corpToken,是使用企业的corpId和corpSecret请求“http://m.jxcloud.3hmis.com/api/sys-api/getToken”获取的,详情阅读建协云开放平台>>获取应用凭证 (opens new window)。
corpToken用于调用开放平台提供的应用级api。
hhh-megrez-bridge框架中以及集成获取corpToken的方法,开发者要配置企业corpId、corpSecret,以及开启获取corpToken业务。
#配置文件配置启用应用凭证(默认不启用)。
megrez.bridge.client.using-corp-token=true
#配置corpId和corpSecret。
megrez.bridge.client.corp-id=
megrez.bridge.client.corp-secret=
配置属性可阅读属性配置
- 使用corpToken 开发者请求开放平台接口时,调用ITokenService.getCorpToken()获取corpToken。
@Autowired
private ITokenService tokenService;
public void getTokenTest() {
String token = tokenService.getCorpToken();
}
# 日志管理
使用AOP处理controller操作日志,日志类型分为:操作日志、编辑日志(保留表,未使用)、错误日志、登录日志。 当前版本需要用户手动创建表结构,表结构请看附件1。
# 附件
# 附件1
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;
# 附件2
【2021-05-20】脚手架升级至【2021-12-27】脚手架说明。
1、打开项目pom.xml文件,将parent版本改为2.1.0-SNAPSHOT
<parent>
<artifactId>framework</artifactId>
<groupId>com.hhh.cloud</groupId>
<version>2.1.0-SNAPSHOT</version>
</parent>
2、将所有引用的“megrez-*”开头的工具包版本改为1.1-SNAPSHOT,例:
<properties>
<megrez-spring-boot-mongodb.version>1.1-SNAPSHOT</megrez-spring-boot-mongodb.version>
<megrez-spring-boot-starter.version>1.1-SNAPSHOT</megrez-spring-boot-starter.version>
</properties>
<dependencies>
<dependency>
<groupId>com.hhh.cloud.framework</groupId>
<artifactId>megrez-spring-boot-starter</artifactId>
<version>${megrez-spring-boot-starter.version}</version>
</dependency>
</dependencies>
3、常见问题
framwork2.1.0最大的升级会涉及到nacos版本问题,中台2.0默认使用nacos。原引用的版本为spring官方提供的jar:
<!-- 1. nacos-配置管理功能依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<!-- 2. nacos-服务发现功能依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
现为适用nacos鉴权安全要求,升级为阿里自己提供的jar:
<!-- 1. nacos-配置管理功能依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${ali-nacos.version}</version>
</dependency>
<!-- 2. nacos-服务发现功能依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${ali-nacos.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
解决以下问题,可参考代码下载中最新版本的pom.xml配置文件
关于nacos,可能会出现下面的问题:
- *framwork2.1.0和megrez-引用的nacos包报错。
删除本地maven库的framwork/2.1.0-SNAPSHOT框架项目和megrez-*的引用包,重新加载。
- 启动时,nacos出现下面的报错。
The bean 'nacosConfigProperties', defined in class path resource [org/springframework/cloud/alibaba/nacos/NacosConfigAutoConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [com/alibaba/cloud/nacos/NacosConfigAutoConfiguration.class] and overriding is disabled.
如出现该报错,可以在bootstarp.properties加入以下配置:
spring.main-allow-bean-definition-overriding=true
- 没有使用nacos,pom注释使用nacos方法。
1)删除pom.xml的原nacos配置:
删除、删除、删除下面这段。
<!-- 1. 如果不使用nacos,忽略nacos-配置管理功能依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${ali-nacos.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 2. 如果不使用nacos,nacos-服务发现功能依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${ali-nacos.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
2)引用的megrez-spring-boot-starter包,忽略nacos配置:
原:
<dependency>
<groupId>com.hhh.cloud.framework</groupId>
<artifactId>megrez-spring-boot-starter</artifactId>
<version>${megrez-spring-boot-starter.version}</version>
</dependency>
改为:
<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>
项目环境忽略nacos配置,增加一下配置:
<!-- 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>