Commit 80a2efb6 authored by zhangc's avatar zhangc

修改api制作想关代码

parent d840e3f3
......@@ -6,12 +6,15 @@ CREATE TABLE `t_api_interface` (
`api_name` varchar(100) DEFAULT NULL COMMENT 'api名称',
`api_desc` varchar(300) DEFAULT NULL COMMENT 'api描述',
`api_protocl` varchar(32) DEFAULT NULL COMMENT 'api请求协议:http,https',
`api_path` varchar(100) DEFAULT NULL COMMENT '请求地址'
`target_url` varchar(100) DEFAULT NULL COMMENT '目标url',
`api_type` varchar(50) NULL DEFAULT '' COMMENT 'api类型:1 实时接入 2 数据银行制作API, 3 数据银行制作数据包 6标签查询 9自定义',
`api_type` varchar(50) NULL DEFAULT '' COMMENT 'api类型:1 数据银行制作API 2 数据银行制作数据包, 3 API实时接入 6 标签查询 9自定义',
`api_function` varchar(200) DEFAULT NULL COMMENT '接口功能',
`join_type` varchar(50) NULL DEFAULT NULL COMMENT '接入类型:字典表对应key值',
`test_example` varchar(255) NULL DEFAULT NULL COMMENT '测试实例';
`status` varchar(50) NOT NULL COMMENT '状态(DRAFT-草稿 ISSUE-发布 OUTMODED-过时 4FREEZE-冻结 EXPIRY-失效)',
`output_type` varchar(50) NULL DEFAULT 'JSON' COMMENT '输出类型:flow 流形式输出, json格式输出',
`page` tinyint(2) NULL DEFAULT '0' COMMENT '是否分页:0 false ,1 true',
`version` varchar(20) DEFAULT '1.0' COMMENT '版本号',
`sign_type` varchar(50) DEFAULT NULL COMMENT '加密方式: MD5 RSA',
`timeout` varchar(50) DEFAULT NULL COMMENT '超时时间',
......@@ -39,6 +42,7 @@ CREATE TABLE `t_api_interface_custom` (
`req_headers` varchar(300) DEFAULT NULL COMMENT '请求头',
`resp_code` varchar(300) DEFAULT NULL COMMENT '响应状态码',
`api_example` varchar(300) DEFAULT NULL COMMENT 'api返回样例',
`inbox_param` varchar(300) NULL DEFAULT NULL COMMENT '固定参数',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`create_user` varchar(100) DEFAULT NULL COMMENT '创建人',
......@@ -54,7 +58,6 @@ CREATE TABLE `t_api_interface_file` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'api文件表自增ID',
`project_id` bigint(20) NOT NULL COMMENT '项目编号',
`file_source` varchar(50) DEFAULT NULL COMMENT '文件来源:,1 dmp, 2 数据银行',
`file_type` varchar(20) DEFAULT NULL COMMENT '文件类型:1 文件夹 ,2 文件',
`file_name` varchar(50) DEFAULT NULL COMMENT '文件名称',
`file_en_name` varchar(50) DEFAULT NULL COMMENT '文件英文名称',
`parent_id` bigint(20) DEFAULT NULL COMMENT '父类id',
......
......@@ -36,8 +36,8 @@ public class ApiDirectionController {
*/
@ApiOperation("api类型列表")
@PostMapping(value = "/getApiTypeList")
public Mono<Result> getApiTypeList(@RequestParam(name = "parentCode") String parentCode) {
return Mono.fromSupplier(() -> Result.of_success(apiDirectionService.getApiType(parentCode)));
public Mono<Result> getApiTypeList(@RequestParam(name = "parentKey") String parentKey) {
return Mono.fromSupplier(() -> Result.of_success(apiDirectionService.getApiType(parentKey)));
}
/**
* @Description:查询某个类型的字典值
......
......@@ -36,9 +36,10 @@ public class ProducerController {
*/
@ApiOperation("Api制作(获取文件夹列表)")
@GetMapping(value = "/getFileCatalog")
public Mono<Result> getFileCatalog(@RequestParam(name = "pageNum",defaultValue = "1",required = false)String pageNum,
public Mono<Result> getFileCatalog(@RequestParam(name = "projectId")Long projectId,
@RequestParam(name = "pageNum",defaultValue = "1",required = false)String pageNum,
@RequestParam(name = "pageSize",defaultValue = "10",required = false)String pageSize) {
return Mono.fromSupplier(() -> Result.of_success(producerService.getFileCatalog(pageNum,pageSize)));
return Mono.fromSupplier(() -> Result.of_success(producerService.getFileCatalog(projectId,pageNum,pageSize)));
}
/**
* @Description:Api制作(自定义)
......
......@@ -49,10 +49,16 @@ public class ApiInterface extends BaseObject implements Serializable {
private String apiProtocl;
/**
* api类型:1 实时接入 2 数据银行制作API, 3 数据银行制作数据包 6标签查询 9自定义'
* api类型:1 数据银行制作API 2 数据银行制作数据包, 3 API实时接入 6 标签查询 9自定义'
*/
@TableField("api_type")
private String apiType;
/**
* 请求地址
*/
@TableField("api_path")
private String apiPath;
/**
* 目标url
*/
......@@ -68,6 +74,16 @@ public class ApiInterface extends BaseObject implements Serializable {
*/
@TableField("test_example")
private String testExample;
/**
* '输出类型:flow 流形式输出, json格式输出',
*/
@TableField("output_type")
private String outputType;
/**
* 是否分页:0 false ,1 true
*/
@TableField("page")
private Boolean page;
/**
* 状态(1-草稿 2-发布 3-过时 4-冻结 5-失效)
......
......@@ -36,11 +36,6 @@ public class ApiInterfaceCustom extends BaseObject implements Serializable {
@TableField("api_interface_id")
private Long apiInterfaceId;
/**
* api类型:1 实时接入 2 数据银行制作API, 3 数据银行制作数据包 6标签查询 9自定义'
*/
@TableField("api_type")
private String apiType;
/**
* api请求参数
......@@ -69,5 +64,10 @@ public class ApiInterfaceCustom extends BaseObject implements Serializable {
*/
@TableField("api_example")
private String apiExample;
/**
* 固定参数
*/
@TableField("inbox_param")
private String inboxParam;
}
......@@ -36,11 +36,11 @@ public class ApiInterfaceFile extends BaseObject implements Serializable {
@TableField("file_source")
private String fileSource;
/**
* 文件类型:1 文件夹 ,2 文件
*/
@TableField("file_type")
private String fileType;
///**
//* 文件类型:1 文件夹 ,2 文件
//*/
//@TableField("file_type")
//private String fileType;
/**
* 文件名称
......
......@@ -22,10 +22,6 @@ public class ApiInterfaceReq {
@NotNull(message = "api类型不能为空")
public String apiType;
/* @ApiModelProperty(value = "apiId 等价于apiKey",required = true)
@NotNull(message = "apiId不能为空")
public String apiId;*/
@ApiModelProperty(value = "接口描述",required = false)
public String apiDesc;
......@@ -53,9 +49,9 @@ public class ApiInterfaceReq {
@ApiModelProperty(value = "api描述",required = false)
public String apiFunction;
@ApiModelProperty(value = "文件Id",required = true)
@NotNull(message="文件id不能为空")
public Long fileId;
@ApiModelProperty(value = "父类文件id,一级文件夹传入0",required = true)
@NotNull(message="父类id文件id不能为空")
public Long parentId;
@ApiModelProperty(value = "项目id",required = true)
@NotNull(message="项目id不能为空")
......
......@@ -20,9 +20,9 @@ import java.io.Serializable;
@ApiModel("数据银行api制作")
public class MakeDataBankApiReq implements Serializable {
@ApiModelProperty(value = "api类型:1 实时接入 2 数据银行制作API, 3 数据银行制作数据包 6标签查询 9自定义",required = true)
@NotNull(message = "api类型不能为空")
public String apiType;
//@ApiModelProperty(value = "api类型:1 数据银行制作API 2 数据银行制作数据包, 3 API实时接入 6 标签查询 9自定义",required = true)
//@NotNull(message = "api类型不能为空")
//public String apiType;
@ApiModelProperty(value = "传输方式(1为HTTPS,2为HTTP)",required = true)
@NotNull(message = "传输方式不能为空")
......@@ -36,6 +36,17 @@ public class MakeDataBankApiReq implements Serializable {
@NotNull(message = "接入类型不能为空")
public String joinType;
@ApiModelProperty(value = "输出类型:flow 流,json json形式",required = true)
@NotNull(message = "输出类型不能为空")
public String outputType;
@ApiModelProperty(value = "是否分页:",required = false)
//@NotNull(message = "是否分页不能为空")
public Boolean page;
@ApiModelProperty(value = "请求地址",required = false)
public String apiPath;
@ApiModelProperty(value = "接口描述",required = false)
public String apiDesc;
......
......@@ -17,10 +17,10 @@ public interface ApiDirectionService {
/**
* 根据类型获取API类型信息
* @param parentCode
* @param parentKey
* @return
*/
List<ApiDirection> getApiType(String parentCode);
List<ApiDirection> getApiType(String parentKey);
/**
* 查询code值信息
......
......@@ -93,7 +93,8 @@ public interface ProducerService {
* 获取文件列表
* @param pageNum
* @param pageSize
* @param projectId
* @return
*/
IPage<ApiInterfaceFile> getFileCatalog( String pageNum, String pageSize);
IPage<ApiInterfaceFile> getFileCatalog(Long projectId ,String pageNum, String pageSize);
}
......@@ -29,25 +29,31 @@ public class ApiDirectionServiceImpl implements ApiDirectionService {
private ApiDirectionMapper apiDirectionMapper;
@Override
public List<ApiDirection> getApiType(String parentCode) {
public List<ApiDirection> getApiType(String parentKey) {
QueryWrapper<ApiDirection> query = new QueryWrapper<>();
query.eq("parent",parentCode);//父类下的所有子类
query.eq("parent",parentKey);//父类下的所有子类
query.eq("is_enabled", GeneralStatusTypeEnum.ENABLE);
return apiDirectionMapper.selectList(query);
List<ApiDirection> apiDirections = apiDirectionMapper.selectList(query);
apiDirections.forEach((x)->{
if (null == x.getParent()) {
apiDirections.remove(x.getId());
}
});
return apiDirections;
}
@Override
public List<ApiDirection> getDirectionVal(String key,String code) {
QueryWrapper<ApiDirection> query = new QueryWrapper<>();
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(code)){
query.eq("key",key);
query.eq("code",code);
query.eq("`key`",key);
query.eq("`code`",code);
query.eq("is_enabled", GeneralStatusTypeEnum.ENABLE);
}else if (StringUtils.isNotBlank(code)){
query.eq("key",key);
}else if (StringUtils.isNotBlank(key)){
query.eq("`key`",key);
query.eq("is_enabled", GeneralStatusTypeEnum.ENABLE);
}else {
query.eq("code",code);
query.eq("`code`",code);
query.eq("is_enabled", GeneralStatusTypeEnum.ENABLE);
}
return apiDirectionMapper.selectList(query);
......
......@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jz.common.bean.SysUserDto;
import com.jz.common.constant.RedisMessageConstant;
import com.jz.common.constant.ResultCode;
import com.jz.common.constant.ResultMsg;
import com.jz.common.exception.ResponseException;
import com.jz.common.utils.HttpsUtils;
......@@ -80,17 +81,18 @@ public class ProducerServiceImpl implements ProducerService {
/**
* 获取文件列表
*
* @param projectId
* @param pageSize
* @param pageNum
* @return
*/
@Override
public IPage<ApiInterfaceFile> getFileCatalog(String pageNum, String pageSize) {
public IPage<ApiInterfaceFile> getFileCatalog(Long projectId,String pageNum, String pageSize) {
Integer pageN = Integer.valueOf(pageNum);
Integer pageS = Integer.valueOf(pageSize);
IPage<ApiInterfaceFile> page = new Page<>(pageN, pageS);
QueryWrapper<ApiInterfaceFile> query = new QueryWrapper<>();
query.eq("project_id",projectId);
query.eq("is_deleted", 0);
query.orderByDesc("create_date");
return apiInterfaceFileMapper.selectPage(page, query);
......@@ -116,16 +118,22 @@ public class ProducerServiceImpl implements ProducerService {
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public Result addDataBankApiInfo(MakeDataBankApiReq req) {
List<ApiInterfaceFile> fileSource = apiInterfaceFileMapper.selectList(new QueryWrapper<ApiInterfaceFile>().eq("file_source", "2"));
SysUserDto currentUser = getLoginUser(RedisMessageConstant.SENDTYPE_LOGIN_SYS);
if (null == currentUser) {
return Result.of_error(ResultMsg.USER_NOT_LOGIN);
}
List<ApiInterfaceFile> fileSource =
apiInterfaceFileMapper.selectList(new QueryWrapper<ApiInterfaceFile>().eq("file_source", "2"));
if (fileSource.size() == 0 || fileSource.size() >= 2) {
return Result.of_error("文件夹信息异常!");
}
String apiKey ="";
if (StringUtils.isNotBlank(req.getApiType())
&& "2".equals(req.getApiType())) {//数据银行制作API
if (StringUtils.isNotBlank(req.getJoinType())
&& "10006".equals(req.getJoinType())) {//数据银行制作API
apiKey = RandomUtil.getStringRandom(16);
ApiInterface anInterface = new ApiInterface();
anInterface.setCreateUser("");
anInterface.setApiType("2");//数据银行制作api
anInterface.setStatus(ProducerStatusTypeEnum.ISSUE.name());//发布
anInterface.setApiKey(apiKey);//apiKey
anInterface.setFileId(req.getFileId());
......@@ -140,16 +148,19 @@ public class ProducerServiceImpl implements ProducerService {
if (resOut == 0 || resIn == 0) {
throw ResponseException.of_error("保存信息失败!");
}
} else if (StringUtils.isNotBlank(req.getApiType())
&& "3".equals(req.getApiType())) {//数据银行制作数据包
redisUtils.set(apiKey,req);
} else if (StringUtils.isNotBlank(req.getJoinType())
&& "10007".equals(req.getJoinType())) {//数据银行制作数据包
if (StringUtils.isBlank(req.getTargetUrl())) {//目标地址
return Result.of_error("目标地址为空!");
}
ApiInterfaceReq apiInterfaceReq = new ApiInterfaceReq();
apiInterfaceReq.setTransMode(req.getApiProtocl());
apiInterfaceReq.setApiType("2");
apiInterfaceReq.setTransMode(req.getApiProtocl());//请求方式:https http
BeanUtils.copyProperties(req,apiInterfaceReq);
Result result = saveInterfaceAPi(apiInterfaceReq);
apiKey=(String) result.getData();
redisUtils.set(apiKey,req);
}
return Result.of_success(ResultMsg.INSERT_SUCCESS,apiKey);
}
......@@ -175,9 +186,9 @@ public class ProducerServiceImpl implements ProducerService {
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public Result addBigDataMakeApi(MakeBigDataApiReq req) {
SysUserDto currentUser = (SysUserDto)redisTemplate.opsForValue().get("USER"+ RedisMessageConstant.SENDTYPE_LOGIN_SYS);
SysUserDto currentUser = getLoginUser(RedisMessageConstant.SENDTYPE_LOGIN_SYS);
if (null == currentUser) {
return Result.of_error(ResultMsg.USER_NOT_EXIST);
return Result.of_error(ResultMsg.USER_NOT_LOGIN);
}
QueryWrapper<ApiOpenApiEsFields> queryOpenApi = new QueryWrapper<>();
queryOpenApi.eq("es_database", req.getEsDatabase());
......@@ -200,7 +211,7 @@ public class ProducerServiceImpl implements ProducerService {
fields.setFieldName(jsonObject.get("name").toString());
fields.setFieldType(jsonObject.get("type").toString());
fields.setFieldDesc(jsonObject.get("desc").toString());
//fields.setCreateUser(currentUser.getUserName());
fields.setCreateUser(currentUser.getUserName());
listApiEsFields.add(fields);
}
//保存字段表中的字段信息
......@@ -213,7 +224,9 @@ public class ProducerServiceImpl implements ProducerService {
if (null != dataSource) {
redisTemplate.opsForValue().set(TagConstants.OPEN_API_HANDLER_INFO_NAMESPACE + redisValueOfKey, req.getHandleType());
//es相关信息
redisTemplate.opsForValue().set(TagConstants.OPEN_API_ESTAG_INFO_NAMESPACE + redisValueOfKey, req);
//redisTemplate.opsForValue().set(TagConstants.OPEN_API_ESTAG_INFO_NAMESPACE + redisValueOfKey, req);
//存入调用的基本ApiKey信息
redisTemplate.opsForValue().set( redisValueOfKey, req);
//esjdbc 连接地址 用于接口中调用获取es数据
redisTemplate.opsForValue().set(TagConstants.OPEN_API_ESTAG_JDBC_INFO_NAMESPACE + redisValueOfKey, dataSource.getJdbcUrl());
}
......@@ -244,21 +257,31 @@ public class ProducerServiceImpl implements ProducerService {
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public Result saveInterfaceAPi(ApiInterfaceReq req) {
SysUserDto currentUser = getLoginUser(RedisMessageConstant.SENDTYPE_LOGIN_SYS);
if (null == currentUser) {
return Result.of_error(ResultMsg.USER_NOT_LOGIN);
}
QueryWrapper<ApiInterfaceFile> query = new QueryWrapper<>();
//query.eq("project_id", req.getProjectId());
query.eq("id", req.getFileId());
query.eq("project_id", req.getProjectId());
query.eq("parent_id", req.getParentId());
ApiInterfaceFile file = apiInterfaceFileMapper.selectOne(query);
if (null == file) {
//查询父类是否存在
ApiInterfaceFile parentId = apiInterfaceFileMapper.selectOne(new QueryWrapper<ApiInterfaceFile>().eq("parent_id", req.getParentId()));
if (null == parentId && "0".equals(req.getParentId())){
file= new ApiInterfaceFile();
file.setProjectId(req.getProjectId());
file.setFileSource("1");//dmp
file.setFileType("1");//文件夹
file.setParentId("0");
file.setStatus(GeneralStatusTypeEnum.VALID.name());
file.setCreateUser("");
file.setRemark("创建文件夹");
if ( apiInterfaceFileMapper.insert(file) == 0){
throw ResponseException.of_error("创建文件夹失败!");
}
}else {
throw ResponseException.of(ResultCode.FAILURE,"父类文件信息不存在!");
}
}
//生成ApiKey
String apiKey = RandomUtil.getStringRandom(16);
......@@ -268,7 +291,7 @@ public class ProducerServiceImpl implements ProducerService {
apiInterface.setStatus(ApiStatusEnum.ISSUE.name());//发布
apiInterface.setFileId(file.getId());
BeanUtils.copyProperties(req, apiInterface);
// apiInterface.setCreateUser(currentUser.getUserName());
apiInterface.setCreateUser(currentUser.getUserName());
Long timeout = Long.parseLong(req.getTimeout());
if (timeout == null || timeout == 0) {
apiInterface.setTimeout(String.valueOf(defaultTimeout));
......@@ -291,9 +314,9 @@ public class ProducerServiceImpl implements ProducerService {
*/
@Override
public Result saveUpdateAPiInfo(MakeApiSaveInfoReq req) {
SysUserDto currentUser = (SysUserDto) redisTemplate.opsForValue().get("USER" + RedisMessageConstant.SENDTYPE_LOGIN_SYS);
SysUserDto currentUser = getLoginUser(RedisMessageConstant.SENDTYPE_LOGIN_SYS);
if (null == currentUser) {
return Result.of_error(ResultMsg.USER_NOT_EXIST);
return Result.of_error(ResultMsg.USER_NOT_LOGIN);
}
ApiInterface apiInterface = apiInterfaceMapper.selectById(req.getId());
if (null == apiInterface) {
......@@ -337,7 +360,7 @@ public class ProducerServiceImpl implements ProducerService {
}
apiInterface.setUpdateDate(new Date());
apiInterface.setTimeout(req.getTimeout());
apiInterface.setUpdateUser("");
apiInterface.setUpdateUser(currentUser.getUserName());
int result = apiInterfaceMapper.updateById(apiInterface);
if (result > 0) {
return Result.of_success(ResultMsg.UPDATE_SUCCESS);
......@@ -487,4 +510,18 @@ public class ProducerServiceImpl implements ProducerService {
}
return Result.of_success(resp);
}
/**
* 获取当前登录用户
* @param userType
* @return
*/
protected SysUserDto getLoginUser(String userType){
SysUserDto currentUser = (SysUserDto)
redisTemplate.opsForValue().get("USER_" + RedisMessageConstant.SENDTYPE_LOGIN_SYS);
if (null != currentUser){
return currentUser;
}
return null;
}
}
package com.jz.dm.service.request;
import com.alibaba.fastjson.JSONObject;
import com.jz.common.utils.HttpsUtils;
import com.jz.common.utils.RedisUtils;
import com.jz.dm.common.enums.GatewayResultCode;
import com.jz.dm.common.util.OpenApiRequest;
import com.jz.dm.common.util.OpenApiResponse;
......@@ -15,6 +17,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map;
/**
* @author ZC
* @PACKAGE_NAME: com.jz.dm.service.request
......@@ -39,6 +43,10 @@ public class ApiQueryService implements OpenApiService {
@Autowired
private ApiInterfaceService apiInterfaceService;
@Autowired
private RedisUtils redisUtils;
@Autowired
private HttpsUtils httpsUtils;
@Override
@ApiLogAspect(description = "API请求日志")
@AccessLimit(limit = 10000,sec = 1)
......@@ -57,6 +65,22 @@ public class ApiQueryService implements OpenApiService {
break;
case "CUSTOM_QUERY": //自定义查询(三方查询)
break;
case "DATA_BANK_QUERY": //数据银行查询
String reqParams = parameter.getString("reqParams");
if (StringUtils.isNotBlank(reqParams)){
String apiInterface = redisUtils.get(request.getAppKey());
if (null != apiInterface){//存在
JSONObject jsonObject = JSONObject.parseObject(apiInterface);
String requestParam = jsonObject.getString("requestParam");
String targetUrl =jsonObject.getString("targetUrl");
Map param = (Map)JSONObject.parseObject(requestParam);
String respResult = httpsUtils.doGet(targetUrl, param);
response.setAttribute(respResult);
}else {//不存在查询数据库
//apiInterfaceService.getReqTargetInfo(request.getAppKey());
}
}
break;
case "DATA_BAG_QUERY": //数据包查询
break;
default :
......
package com.jz.dm.gateway.orther;
import com.jz.common.utils.WebUtils;
import com.alibaba.fastjson.JSONObject;
import com.jz.common.utils.HttpsUtils;
import com.jz.dm.gateway.SpringTestCase;
import com.jz.dm.service.ProducerService;
import org.junit.Test;
......@@ -23,19 +24,21 @@ public class TestMakeApi extends SpringTestCase {
@Autowired
private ProducerService producerService;
@Autowired
private HttpsUtils httpsUtils;
@Test
public void testApiMake() {
Map headers = new HashMap<String, String>();
headers.put("Content-Type","application/json;charset=UTF-8");
headers.put("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36");
Map params = new HashMap<String, String>();
JSONObject params = new JSONObject();
params.put("apiType","2");
params.put("apiKey","www.q99sss9");
params.put("apiProtocl","HTTPS");
params.put("type","1");
try {
String result = WebUtils.post(url, params,headers);
String result = httpsUtils.submitPost(url, params,headers);
System.out.println("接受到的结果为:"+result);
} catch (Exception e) {
e.printStackTrace();
......
......@@ -78,9 +78,9 @@ public enum ResultMsg {
*/
INVALID_USER("用户错误"),
/**
* 用户已报备
* 用户未登录
*/
USER_REPORTED("用户已报备"),
USER_NOT_LOGIN("用户未登录"),
/**
* 用户名错误
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment