mirror of https://github.com/jeecgboot/jeecg-boot
				
				
				
			Merge branch 'master' of https://github.com/zhangdaiscott/jeecg-boot
						commit
						45f905ddac
					
				| 
						 | 
				
			
			@ -180,6 +180,8 @@ public class ShiroConfig {
 | 
			
		|||
        // 企业微信证书排除
 | 
			
		||||
        filterChainDefinitionMap.put("/WW_verify*", "anon");
 | 
			
		||||
 | 
			
		||||
        filterChainDefinitionMap.put("/openapi/call/**", "anon");
 | 
			
		||||
 | 
			
		||||
        // 添加自己的过滤器并且取名为jwt
 | 
			
		||||
        Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
 | 
			
		||||
        //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,112 @@
 | 
			
		|||
package org.jeecg.modules.openapi.controller;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import org.jeecg.common.api.vo.Result;
 | 
			
		||||
import org.jeecg.common.system.base.controller.JeecgController;
 | 
			
		||||
import org.jeecg.common.system.query.QueryGenerator;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiAuth;
 | 
			
		||||
import org.jeecg.modules.openapi.generator.AKSKGenerator;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiAuthService;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 9:54
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/openapi/auth")
 | 
			
		||||
public class OpenApiAuthController extends JeecgController<OpenApiAuth, OpenApiAuthService> {
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页列表查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param openApiAuth
 | 
			
		||||
     * @param pageNo
 | 
			
		||||
     * @param pageSize
 | 
			
		||||
     * @param req
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping(value = "/list")
 | 
			
		||||
    public Result<?> queryPageList(OpenApiAuth openApiAuth, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
 | 
			
		||||
                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
 | 
			
		||||
        QueryWrapper<OpenApiAuth> queryWrapper = QueryGenerator.initQueryWrapper(openApiAuth, req.getParameterMap());
 | 
			
		||||
        Page<OpenApiAuth> page = new Page<>(pageNo, pageSize);
 | 
			
		||||
        IPage<OpenApiAuth> pageList = service.page(page, queryWrapper);
 | 
			
		||||
        return Result.ok(pageList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 添加
 | 
			
		||||
     *
 | 
			
		||||
     * @param openApiAuth
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping(value = "/add")
 | 
			
		||||
    public Result<?> add(@RequestBody OpenApiAuth openApiAuth) {
 | 
			
		||||
        service.save(openApiAuth);
 | 
			
		||||
        return Result.ok("添加成功!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 编辑
 | 
			
		||||
     *
 | 
			
		||||
     * @param openApiAuth
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping(value = "/edit")
 | 
			
		||||
    public Result<?> edit(@RequestBody OpenApiAuth openApiAuth) {
 | 
			
		||||
        service.updateById(openApiAuth);
 | 
			
		||||
        return Result.ok("修改成功!");
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过id删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param id
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @DeleteMapping(value = "/delete")
 | 
			
		||||
    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
 | 
			
		||||
        service.removeById(id);
 | 
			
		||||
        return Result.ok("删除成功!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @DeleteMapping(value = "/deleteBatch")
 | 
			
		||||
    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
 | 
			
		||||
 | 
			
		||||
        this.service.removeByIds(Arrays.asList(ids.split(",")));
 | 
			
		||||
        return Result.ok("批量删除成功!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过id查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param id
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping(value = "/queryById")
 | 
			
		||||
    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
 | 
			
		||||
        OpenApiAuth openApiAuth = service.getById(id);
 | 
			
		||||
        return Result.ok(openApiAuth);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 生成AKSK
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("genAKSK")
 | 
			
		||||
    public Result<String[]> genAKSK() {
 | 
			
		||||
        return Result.ok(AKSKGenerator.genAKSKPair());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,392 @@
 | 
			
		|||
package org.jeecg.modules.openapi.controller;
 | 
			
		||||
 | 
			
		||||
import com.alibaba.fastjson.JSONObject;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.fasterxml.classmate.TypeResolver;
 | 
			
		||||
import com.google.common.collect.Lists;
 | 
			
		||||
import org.jeecg.common.api.vo.Result;
 | 
			
		||||
import org.jeecg.common.constant.CommonConstant;
 | 
			
		||||
import org.jeecg.common.system.base.controller.JeecgController;
 | 
			
		||||
import org.jeecg.common.system.query.QueryGenerator;
 | 
			
		||||
import org.jeecg.common.system.util.JwtUtil;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApi;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiAuth;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiHeader;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiParam;
 | 
			
		||||
import org.jeecg.modules.openapi.generator.PathGenerator;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiAuthService;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiHeaderService;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiParamService;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiService;
 | 
			
		||||
import org.jeecg.modules.openapi.swagger.*;
 | 
			
		||||
import org.jeecg.modules.system.entity.SysUser;
 | 
			
		||||
import org.jeecg.modules.system.service.ISysUserService;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.http.HttpEntity;
 | 
			
		||||
import org.springframework.http.HttpHeaders;
 | 
			
		||||
import org.springframework.http.HttpMethod;
 | 
			
		||||
import org.springframework.util.CollectionUtils;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
import org.springframework.web.client.RestTemplate;
 | 
			
		||||
import springfox.documentation.spring.web.DocumentationCache;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 9:11
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/openapi")
 | 
			
		||||
public class OpenApiController extends JeecgController<OpenApi, OpenApiService> {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RestTemplate restTemplate;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private OpenApiParamService openApiParamService;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private OpenApiHeaderService openApiHeaderService;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private DocumentationCache documentationCache;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private TypeResolver typeResolver;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private ISysUserService sysUserService;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private OpenApiAuthService openApiAuthService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页列表查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param openApi
 | 
			
		||||
     * @param pageNo
 | 
			
		||||
     * @param pageSize
 | 
			
		||||
     * @param req
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping(value = "/list")
 | 
			
		||||
    public Result<?> queryPageList(OpenApi openApi, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
 | 
			
		||||
                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
 | 
			
		||||
        QueryWrapper<OpenApi> queryWrapper = QueryGenerator.initQueryWrapper(openApi, req.getParameterMap());
 | 
			
		||||
        Page<OpenApi> page = new Page<>(pageNo, pageSize);
 | 
			
		||||
        IPage<OpenApi> pageList = service.page(page, queryWrapper);
 | 
			
		||||
        for (OpenApi api : pageList.getRecords()) {
 | 
			
		||||
            api.setParams(openApiParamService.findByApiId(api.getId()));
 | 
			
		||||
            api.setHeaders(openApiHeaderService.findByApiId(api.getId()));
 | 
			
		||||
        }
 | 
			
		||||
        return Result.ok(pageList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 添加
 | 
			
		||||
     *
 | 
			
		||||
     * @param openApi
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping(value = "/add")
 | 
			
		||||
    public Result<?> add(@RequestBody OpenApi openApi) {
 | 
			
		||||
        if (service.save(openApi)) {
 | 
			
		||||
            if (!CollectionUtils.isEmpty(openApi.getHeaders())) {
 | 
			
		||||
                openApiHeaderService.saveBatch(openApi.getHeaders());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!CollectionUtils.isEmpty(openApi.getParams())) {
 | 
			
		||||
                openApiParamService.saveBatch(openApi.getParams());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return Result.ok("添加成功!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 编辑
 | 
			
		||||
     *
 | 
			
		||||
     * @param openApi
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping(value = "/edit")
 | 
			
		||||
    public Result<?> edit(@RequestBody OpenApi openApi) {
 | 
			
		||||
        if (service.updateById(openApi)) {
 | 
			
		||||
            openApiHeaderService.deleteByApiId(openApi.getId());
 | 
			
		||||
            openApiParamService.deleteByApiId(openApi.getId());
 | 
			
		||||
 | 
			
		||||
            if (!CollectionUtils.isEmpty(openApi.getHeaders())) {
 | 
			
		||||
                openApiHeaderService.saveBatch(openApi.getHeaders());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!CollectionUtils.isEmpty(openApi.getParams())) {
 | 
			
		||||
                openApiParamService.saveBatch(openApi.getParams());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return Result.ok("修改成功!");
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过id删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param id
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @DeleteMapping(value = "/delete")
 | 
			
		||||
    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
 | 
			
		||||
        service.removeById(id);
 | 
			
		||||
        return Result.ok("删除成功!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @DeleteMapping(value = "/deleteBatch")
 | 
			
		||||
    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
 | 
			
		||||
 | 
			
		||||
        this.service.removeByIds(Arrays.asList(ids.split(",")));
 | 
			
		||||
        return Result.ok("批量删除成功!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过id查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param id
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping(value = "/queryById")
 | 
			
		||||
    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
 | 
			
		||||
        OpenApi OpenApi = service.getById(id);
 | 
			
		||||
        return Result.ok(OpenApi);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 接口调用
 | 
			
		||||
     * @param path
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @RequestMapping(value = "/call/{path}", method = {RequestMethod.GET,RequestMethod.POST})
 | 
			
		||||
    public Result<?> call(@PathVariable String path, @RequestBody(required = false) String json, HttpServletRequest request) {
 | 
			
		||||
        OpenApi openApi = service.findByPath(path);
 | 
			
		||||
        if (Objects.isNull(openApi)) {
 | 
			
		||||
            Map<String, Object> result = new HashMap<>();
 | 
			
		||||
            result.put("code", 404);
 | 
			
		||||
            result.put("data", null);
 | 
			
		||||
            return Result.error("失败", result);
 | 
			
		||||
        }
 | 
			
		||||
        List<OpenApiHeader> headers = openApiHeaderService.findByApiId(openApi.getId());
 | 
			
		||||
 | 
			
		||||
        String url = openApi.getOriginUrl();
 | 
			
		||||
        String method = openApi.getRequestMethod();
 | 
			
		||||
 | 
			
		||||
        HttpHeaders httpHeaders = new HttpHeaders();
 | 
			
		||||
        for (OpenApiHeader header : headers) {
 | 
			
		||||
            httpHeaders.put(header.getHeaderKey(), Lists.newArrayList(request.getHeader(header.getHeaderKey())));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        String appkey = request.getHeader("appkey");
 | 
			
		||||
        OpenApiAuth openApiAuth = openApiAuthService.getByAppkey(appkey);
 | 
			
		||||
        SysUser systemUser = sysUserService.getById(openApiAuth.getSystemUserId());
 | 
			
		||||
        String token = JwtUtil.sign(systemUser.getUsername(), systemUser.getPassword());
 | 
			
		||||
        httpHeaders.put("X-Access-Token", Lists.newArrayList(token));
 | 
			
		||||
 | 
			
		||||
        HttpEntity<String> httpEntity = new HttpEntity<>(json, httpHeaders);
 | 
			
		||||
 | 
			
		||||
        return restTemplate.exchange(url, HttpMethod.resolve(method), httpEntity, Result.class, request.getParameterMap()).getBody();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/json")
 | 
			
		||||
    public SwaggerModel swaggerModel() {
 | 
			
		||||
 | 
			
		||||
        SwaggerModel swaggerModel = new SwaggerModel();
 | 
			
		||||
        swaggerModel.setSwagger("2.0");
 | 
			
		||||
        swaggerModel.setInfo(swaggerInfo());
 | 
			
		||||
        swaggerModel.setHost("jeecg.com");
 | 
			
		||||
        swaggerModel.setBasePath("/jeecg-boot");
 | 
			
		||||
        swaggerModel.setSchemes(Lists.newArrayList("http", "https"));
 | 
			
		||||
 | 
			
		||||
        SwaggerTag swaggerTag = new SwaggerTag();
 | 
			
		||||
        swaggerTag.setName("openapi");
 | 
			
		||||
        swaggerModel.setTags(Lists.newArrayList(swaggerTag));
 | 
			
		||||
 | 
			
		||||
        pathsAndDefinitions(swaggerModel);
 | 
			
		||||
 | 
			
		||||
        return swaggerModel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void pathsAndDefinitions(SwaggerModel swaggerModel) {
 | 
			
		||||
        Map<String, Map<String, SwaggerOperation>> paths = new HashMap<>();
 | 
			
		||||
        Map<String, SwaggerDefinition> definitions = new HashMap<>();
 | 
			
		||||
        List<OpenApi> openapis = service.list();
 | 
			
		||||
        for (OpenApi openApi : openapis) {
 | 
			
		||||
            Map<String, SwaggerOperation> operations = new HashMap<>();
 | 
			
		||||
            SwaggerOperation operation = new SwaggerOperation();
 | 
			
		||||
            operation.setTags(Lists.newArrayList("openapi"));
 | 
			
		||||
            operation.setSummary(openApi.getName());
 | 
			
		||||
            operation.setDescription(openApi.getName());
 | 
			
		||||
            operation.setOperationId(openApi.getRequestUrl()+"Using"+openApi.getRequestMethod());
 | 
			
		||||
            operation.setProduces(Lists.newArrayList("application/json"));
 | 
			
		||||
            parameters(operation, openApi);
 | 
			
		||||
 | 
			
		||||
            // body入参
 | 
			
		||||
            if (StringUtils.hasText(openApi.getBody())) {
 | 
			
		||||
                SwaggerDefinition definition = new SwaggerDefinition();
 | 
			
		||||
                definition.setType("object");
 | 
			
		||||
                Map<String, SwaggerDefinitionProperties> definitionProperties = new HashMap<>();
 | 
			
		||||
                definition.setProperties(definitionProperties);
 | 
			
		||||
 | 
			
		||||
                JSONObject jsonObject = JSONObject.parseObject(openApi.getBody());
 | 
			
		||||
                for (Map.Entry<String, Object> properties : jsonObject.entrySet()) {
 | 
			
		||||
                    SwaggerDefinitionProperties swaggerDefinitionProperties = new SwaggerDefinitionProperties();
 | 
			
		||||
                    swaggerDefinitionProperties.setType("string");
 | 
			
		||||
                    swaggerDefinitionProperties.setDescription(properties.getValue()+"");
 | 
			
		||||
                    definitionProperties.put(properties.getKey(), swaggerDefinitionProperties);
 | 
			
		||||
                }
 | 
			
		||||
                // body的definition构建完成
 | 
			
		||||
                definitions.put(openApi.getRequestUrl()+"Using"+openApi.getRequestMethod()+"body", definition);
 | 
			
		||||
 | 
			
		||||
                SwaggerOperationParameter bodyParameter = new SwaggerOperationParameter();
 | 
			
		||||
                bodyParameter.setDescription(openApi.getName() + " body");
 | 
			
		||||
                bodyParameter.setIn("body");
 | 
			
		||||
                bodyParameter.setName(openApi.getName() + " body");
 | 
			
		||||
                bodyParameter.setRequired(true);
 | 
			
		||||
 | 
			
		||||
                Map<String, String> bodySchema = new HashMap<>();
 | 
			
		||||
                bodySchema.put("$ref", "#/definitions/" + openApi.getRequestUrl()+"Using"+openApi.getRequestMethod()+"body");
 | 
			
		||||
                bodyParameter.setSchema(bodySchema);
 | 
			
		||||
 | 
			
		||||
                // 构建参数构建完成
 | 
			
		||||
                operation.getParameters().add(bodyParameter);
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 响应
 | 
			
		||||
            Map<String, SwaggerOperationResponse> responses = new HashMap<>();
 | 
			
		||||
            SwaggerOperationResponse resp200 = new SwaggerOperationResponse();
 | 
			
		||||
            resp200.setDescription("OK");
 | 
			
		||||
            Map<String, String> respSchema = new HashMap<>();
 | 
			
		||||
            respSchema.put("$ref", "#/definitions/OpenApiResult");
 | 
			
		||||
            resp200.setSchema(respSchema);
 | 
			
		||||
 | 
			
		||||
            responses.put("200", resp200);
 | 
			
		||||
 | 
			
		||||
            Map<String, String> emptySchema = new HashMap<>();
 | 
			
		||||
            SwaggerOperationResponse resp201 = new SwaggerOperationResponse();
 | 
			
		||||
            resp201.setDescription("Created");
 | 
			
		||||
            resp201.setSchema(emptySchema);
 | 
			
		||||
            responses.put("201", resp201);
 | 
			
		||||
            SwaggerOperationResponse resp401 = new SwaggerOperationResponse();
 | 
			
		||||
            resp401.setDescription("Unauthorized");
 | 
			
		||||
            resp401.setSchema(emptySchema);
 | 
			
		||||
            responses.put("401", resp401);
 | 
			
		||||
            SwaggerOperationResponse resp403 = new SwaggerOperationResponse();
 | 
			
		||||
            resp403.setDescription("Forbidden");
 | 
			
		||||
            resp403.setSchema(emptySchema);
 | 
			
		||||
            responses.put("403", resp403);
 | 
			
		||||
            SwaggerOperationResponse resp404 = new SwaggerOperationResponse();
 | 
			
		||||
            resp404.setDescription("Not Found");
 | 
			
		||||
            resp404.setSchema(emptySchema);
 | 
			
		||||
            responses.put("404", resp404);
 | 
			
		||||
 | 
			
		||||
            // 构建响应definition
 | 
			
		||||
            SwaggerDefinition respDefinition = new SwaggerDefinition();
 | 
			
		||||
            respDefinition.setType("object");
 | 
			
		||||
 | 
			
		||||
            Map<String, SwaggerDefinitionProperties> definitionProperties = new HashMap<>();
 | 
			
		||||
            respDefinition.setProperties(definitionProperties);
 | 
			
		||||
 | 
			
		||||
            SwaggerDefinitionProperties codeProperties = new SwaggerDefinitionProperties();
 | 
			
		||||
            codeProperties.setType("integer");
 | 
			
		||||
            codeProperties.setDescription("返回代码");
 | 
			
		||||
            definitionProperties.put("code", codeProperties);
 | 
			
		||||
            SwaggerDefinitionProperties messageProperties = new SwaggerDefinitionProperties();
 | 
			
		||||
            messageProperties.setType("string");
 | 
			
		||||
            messageProperties.setDescription("返回处理消息");
 | 
			
		||||
            definitionProperties.put("message", messageProperties);
 | 
			
		||||
            SwaggerDefinitionProperties resultProperties = new SwaggerDefinitionProperties();
 | 
			
		||||
            resultProperties.setType("object");
 | 
			
		||||
            resultProperties.setDescription("返回数据对象");
 | 
			
		||||
            definitionProperties.put("result", resultProperties);
 | 
			
		||||
            SwaggerDefinitionProperties successProperties = new SwaggerDefinitionProperties();
 | 
			
		||||
            successProperties.setType("boolean");
 | 
			
		||||
            successProperties.setDescription("成功标志");
 | 
			
		||||
            definitionProperties.put("success", successProperties);
 | 
			
		||||
            SwaggerDefinitionProperties timestampProperties = new SwaggerDefinitionProperties();
 | 
			
		||||
            timestampProperties.setType("integer");
 | 
			
		||||
            timestampProperties.setDescription("时间戳");
 | 
			
		||||
            definitionProperties.put("timestamp", timestampProperties);
 | 
			
		||||
 | 
			
		||||
            definitions.put("OpenApiResult", respDefinition);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            operation.setResponses(responses);
 | 
			
		||||
            operations.put(openApi.getRequestMethod().toLowerCase(), operation);
 | 
			
		||||
            paths.put("/openapi/call/"+openApi.getRequestUrl(), operations);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        swaggerModel.setDefinitions(definitions);
 | 
			
		||||
        swaggerModel.setPaths(paths);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void parameters(SwaggerOperation operation, OpenApi openApi) {
 | 
			
		||||
        List<SwaggerOperationParameter> parameters = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        for (OpenApiParam openApiParam : openApiParamService.findByApiId(openApi.getId())) {
 | 
			
		||||
            SwaggerOperationParameter parameter = new SwaggerOperationParameter();
 | 
			
		||||
            parameter.setIn("path");
 | 
			
		||||
            parameter.setName(openApiParam.getParamKey());
 | 
			
		||||
            parameter.setRequired(openApiParam.getRequired() == 1);
 | 
			
		||||
            parameter.setDescription(openApiParam.getNote());
 | 
			
		||||
            parameters.add(parameter);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (OpenApiHeader openApiHeader : openApiHeaderService.findByApiId(openApi.getId())) {
 | 
			
		||||
            SwaggerOperationParameter parameter = new SwaggerOperationParameter();
 | 
			
		||||
            parameter.setIn("header");
 | 
			
		||||
            parameter.setName(openApiHeader.getHeaderKey());
 | 
			
		||||
            parameter.setRequired(openApiHeader.getRequired() == 1);
 | 
			
		||||
            parameter.setDescription(openApiHeader.getNote());
 | 
			
		||||
            parameters.add(parameter);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        operation.setParameters(parameters);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private SwaggerInfo swaggerInfo() {
 | 
			
		||||
        SwaggerInfo info = new SwaggerInfo();
 | 
			
		||||
 | 
			
		||||
        info.setDescription("OpenAPI 接口列表");
 | 
			
		||||
        info.setVersion("3.7.1");
 | 
			
		||||
        info.setTitle("OpenAPI 接口列表");
 | 
			
		||||
        info.setTermsOfService("https://jeecg.com");
 | 
			
		||||
 | 
			
		||||
        SwaggerInfoContact contact = new SwaggerInfoContact();
 | 
			
		||||
        contact.setName("jeecg@qq.com");
 | 
			
		||||
 | 
			
		||||
        info.setContact(contact);
 | 
			
		||||
 | 
			
		||||
        SwaggerInfoLicense license = new SwaggerInfoLicense();
 | 
			
		||||
        license.setName("Apache 2.0");
 | 
			
		||||
        license.setUrl("http://www.apache.org/licenses/LICENSE-2.0.html");
 | 
			
		||||
 | 
			
		||||
        info.setLicense(license);
 | 
			
		||||
 | 
			
		||||
        return info;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 生成接口路径
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("genPath")
 | 
			
		||||
    public Result<String> genPath() {
 | 
			
		||||
        Result<String> r = new Result<String>();
 | 
			
		||||
        r.setSuccess(true);
 | 
			
		||||
        r.setCode(CommonConstant.SC_OK_200);
 | 
			
		||||
        r.setResult(PathGenerator.genPath());
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
package org.jeecg.modules.openapi.controller;
 | 
			
		||||
 | 
			
		||||
import org.jeecg.common.api.vo.Result;
 | 
			
		||||
import org.jeecg.config.shiro.IgnoreAuth;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/20 14:04
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/openapi/demo")
 | 
			
		||||
public class OpenApiIndexController {
 | 
			
		||||
 | 
			
		||||
    @GetMapping("index")
 | 
			
		||||
    @IgnoreAuth
 | 
			
		||||
    public Result<Map<String, String>> index() {
 | 
			
		||||
        Map<String, String> result = new HashMap<>();
 | 
			
		||||
        result.put("first", "Hello World");
 | 
			
		||||
        return Result.ok(result);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
package org.jeecg.modules.openapi.controller;
 | 
			
		||||
 | 
			
		||||
import org.jeecg.common.api.vo.Result;
 | 
			
		||||
import org.jeecg.common.system.base.controller.JeecgController;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiPermission;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiPermissionService;
 | 
			
		||||
import org.springframework.web.bind.annotation.PostMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestBody;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/openapi/permission")
 | 
			
		||||
public class OpenApiPermissionController extends JeecgController<OpenApiPermission, OpenApiPermissionService> {
 | 
			
		||||
 | 
			
		||||
    @PostMapping("add")
 | 
			
		||||
    public Result add(@RequestBody OpenApiPermission openApiPermission) {
 | 
			
		||||
        return Result.ok(service.save(openApiPermission));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,102 @@
 | 
			
		|||
package org.jeecg.modules.openapi.controller;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import org.jeecg.common.api.vo.Result;
 | 
			
		||||
import org.jeecg.common.system.base.controller.JeecgController;
 | 
			
		||||
import org.jeecg.common.system.query.QueryGenerator;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiRecord;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiRecordService;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 9:57
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/openapi/record")
 | 
			
		||||
public class OpenApiRecordController extends JeecgController<OpenApiRecord, OpenApiRecordService> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页列表查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param openApiRecord
 | 
			
		||||
     * @param pageNo
 | 
			
		||||
     * @param pageSize
 | 
			
		||||
     * @param req
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping(value = "/list")
 | 
			
		||||
    public Result<?> queryPageList(OpenApiRecord openApiRecord, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
 | 
			
		||||
                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
 | 
			
		||||
        QueryWrapper<OpenApiRecord> queryWrapper = QueryGenerator.initQueryWrapper(openApiRecord, req.getParameterMap());
 | 
			
		||||
        Page<OpenApiRecord> page = new Page<>(pageNo, pageSize);
 | 
			
		||||
        IPage<OpenApiRecord> pageList = service.page(page, queryWrapper);
 | 
			
		||||
        return Result.ok(pageList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 添加
 | 
			
		||||
     *
 | 
			
		||||
     * @param openApiRecord
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping(value = "/add")
 | 
			
		||||
    public Result<?> add(@RequestBody OpenApiRecord openApiRecord) {
 | 
			
		||||
        service.save(openApiRecord);
 | 
			
		||||
        return Result.ok("添加成功!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 编辑
 | 
			
		||||
     *
 | 
			
		||||
     * @param openApiRecord
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping(value = "/edit")
 | 
			
		||||
    public Result<?> edit(@RequestBody OpenApiRecord openApiRecord) {
 | 
			
		||||
        service.updateById(openApiRecord);
 | 
			
		||||
        return Result.ok("修改成功!");
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过id删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param id
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @DeleteMapping(value = "/delete")
 | 
			
		||||
    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
 | 
			
		||||
        service.removeById(id);
 | 
			
		||||
        return Result.ok("删除成功!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @DeleteMapping(value = "/deleteBatch")
 | 
			
		||||
    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
 | 
			
		||||
 | 
			
		||||
        this.service.removeByIds(Arrays.asList(ids.split(",")));
 | 
			
		||||
        return Result.ok("批量删除成功!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过id查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param id
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping(value = "/queryById")
 | 
			
		||||
    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
 | 
			
		||||
        OpenApiRecord openApiRecord = service.getById(id);
 | 
			
		||||
        return Result.ok(openApiRecord);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,103 @@
 | 
			
		|||
package org.jeecg.modules.openapi.entity;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.IdType;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableField;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableId;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableLogic;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.experimental.Accessors;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 接口表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@EqualsAndHashCode(callSuper = false)
 | 
			
		||||
@Accessors(chain = true)
 | 
			
		||||
public class OpenApi  implements Serializable {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * id
 | 
			
		||||
     */
 | 
			
		||||
    @TableId(type = IdType.ASSIGN_ID)
 | 
			
		||||
    private String id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 接口名称
 | 
			
		||||
     */
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 请求方式,如POST、GET
 | 
			
		||||
     */
 | 
			
		||||
    private String requestMethod;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 对外开放的相对接口路径
 | 
			
		||||
     */
 | 
			
		||||
    private String requestUrl;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * IP 黑名单
 | 
			
		||||
     */
 | 
			
		||||
    private String blackList;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 请求头列表
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(exist = false)
 | 
			
		||||
    private List<OpenApiHeader> headers;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 请求参数列表
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(exist = false)
 | 
			
		||||
    private List<OpenApiParam> params;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 目前仅支持json
 | 
			
		||||
     */
 | 
			
		||||
    private String body;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 原始接口路径
 | 
			
		||||
     */
 | 
			
		||||
    private String originUrl;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 状态(1:正常  2:废弃 )
 | 
			
		||||
     */
 | 
			
		||||
    private Integer status;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除状态(0,正常,1已删除)
 | 
			
		||||
     */
 | 
			
		||||
    @TableLogic
 | 
			
		||||
    private Integer delFlag;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建人
 | 
			
		||||
     */
 | 
			
		||||
    private String createBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建时间
 | 
			
		||||
     */
 | 
			
		||||
    private Date createTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新人
 | 
			
		||||
     */
 | 
			
		||||
    private String updateBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新时间
 | 
			
		||||
     */
 | 
			
		||||
    private Date updateTime;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
package org.jeecg.modules.openapi.entity;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.IdType;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableId;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.experimental.Accessors;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 权限表
 | 
			
		||||
 * @date 2024/12/10 9:38
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@EqualsAndHashCode(callSuper = false)
 | 
			
		||||
@Accessors(chain = true)
 | 
			
		||||
public class OpenApiAuth implements Serializable {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = -5933153354153738498L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * id
 | 
			
		||||
     */
 | 
			
		||||
    @TableId(type = IdType.ASSIGN_ID)
 | 
			
		||||
    private String id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 受权名称
 | 
			
		||||
     */
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * access key
 | 
			
		||||
     */
 | 
			
		||||
    private String ak;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * secret key
 | 
			
		||||
     */
 | 
			
		||||
    private String sk;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 系统用户ID
 | 
			
		||||
     */
 | 
			
		||||
    private String systemUserId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建人
 | 
			
		||||
     */
 | 
			
		||||
    private String createBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建时间
 | 
			
		||||
     */
 | 
			
		||||
    private Date createTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新人
 | 
			
		||||
     */
 | 
			
		||||
    private String updateBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新时间
 | 
			
		||||
     */
 | 
			
		||||
    private Date updateTime;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
package org.jeecg.modules.openapi.entity;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.IdType;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableId;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.experimental.Accessors;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 请求头表
 | 
			
		||||
 * @date 2024/12/10 14:37
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@EqualsAndHashCode(callSuper = false)
 | 
			
		||||
@Accessors(chain = true)
 | 
			
		||||
public class OpenApiHeader implements Serializable {
 | 
			
		||||
    private static final long serialVersionUID = 5032708503120184683L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * id
 | 
			
		||||
     */
 | 
			
		||||
    @TableId(type = IdType.ASSIGN_ID)
 | 
			
		||||
    private String id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 接口ID
 | 
			
		||||
     */
 | 
			
		||||
    private String apiId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * key
 | 
			
		||||
     */
 | 
			
		||||
    private String headerKey;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否必填(0:否,1:是)
 | 
			
		||||
     */
 | 
			
		||||
    private Integer required;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 默认值
 | 
			
		||||
     */
 | 
			
		||||
    private String defaultValue;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 说明
 | 
			
		||||
     */
 | 
			
		||||
    private String note;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
package org.jeecg.modules.openapi.entity;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.IdType;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableId;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.experimental.Accessors;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * query部分参数表
 | 
			
		||||
 * @date 2024/12/10 14:37
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@EqualsAndHashCode(callSuper = false)
 | 
			
		||||
@Accessors(chain = true)
 | 
			
		||||
public class OpenApiParam implements Serializable {
 | 
			
		||||
    private static final long serialVersionUID = -6174831468578022357L;
 | 
			
		||||
    /**
 | 
			
		||||
     * id
 | 
			
		||||
     */
 | 
			
		||||
    @TableId(type = IdType.ASSIGN_ID)
 | 
			
		||||
    private String id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 接口ID
 | 
			
		||||
     */
 | 
			
		||||
    private String apiId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * key
 | 
			
		||||
     */
 | 
			
		||||
    private String paramKey;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否必填(0:否,1:是)
 | 
			
		||||
     */
 | 
			
		||||
    private Integer required;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 默认值
 | 
			
		||||
     */
 | 
			
		||||
    private String defaultValue;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 说明
 | 
			
		||||
     */
 | 
			
		||||
    private String note;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
package org.jeecg.modules.openapi.entity;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.IdType;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableId;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.experimental.Accessors;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @date 2024/12/19 17:41
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@EqualsAndHashCode(callSuper = false)
 | 
			
		||||
@Accessors(chain = true)
 | 
			
		||||
public class OpenApiPermission implements Serializable {
 | 
			
		||||
    /**
 | 
			
		||||
     * id
 | 
			
		||||
     */
 | 
			
		||||
    @TableId(type = IdType.ASSIGN_ID)
 | 
			
		||||
    private String id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 接口ID
 | 
			
		||||
     */
 | 
			
		||||
    private String apiId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 认证ID
 | 
			
		||||
     */
 | 
			
		||||
    private String apiAuthId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建人
 | 
			
		||||
     */
 | 
			
		||||
    private String createBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建时间
 | 
			
		||||
     */
 | 
			
		||||
    private Date createTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新人
 | 
			
		||||
     */
 | 
			
		||||
    private String updateBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新时间
 | 
			
		||||
     */
 | 
			
		||||
    private Date updateTime;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
package org.jeecg.modules.openapi.entity;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.IdType;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableId;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.experimental.Accessors;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 调用记录表
 | 
			
		||||
 * @date 2024/12/10 9:41
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@EqualsAndHashCode(callSuper = false)
 | 
			
		||||
@Accessors(chain = true)
 | 
			
		||||
public class OpenApiRecord implements Serializable {
 | 
			
		||||
    private static final long serialVersionUID = -5870384488947863579L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * id
 | 
			
		||||
     */
 | 
			
		||||
    @TableId(type = IdType.ASSIGN_ID)
 | 
			
		||||
    private String id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 接口ID
 | 
			
		||||
     */
 | 
			
		||||
    private String apiId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调用ID
 | 
			
		||||
     */
 | 
			
		||||
    private String callAuthId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调用时间
 | 
			
		||||
     */
 | 
			
		||||
    private Date callTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 耗时
 | 
			
		||||
     */
 | 
			
		||||
    private Long usedTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 响应时间
 | 
			
		||||
     */
 | 
			
		||||
    private Date responseTime;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,204 @@
 | 
			
		|||
package org.jeecg.modules.openapi.filter;
 | 
			
		||||
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.jeecg.common.exception.JeecgBootException;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApi;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiAuth;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiPermission;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiRecord;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiAuthService;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiPermissionService;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiRecordService;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiService;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
import org.springframework.web.context.WebApplicationContext;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.*;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.security.MessageDigest;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/19 16:55
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class ApiAuthFilter implements Filter {
 | 
			
		||||
 | 
			
		||||
    private OpenApiRecordService openApiRecordService;
 | 
			
		||||
    private OpenApiAuthService openApiAuthService;
 | 
			
		||||
    private OpenApiPermissionService openApiPermissionService;
 | 
			
		||||
    private OpenApiService openApiService;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 | 
			
		||||
        long startTime = System.currentTimeMillis();
 | 
			
		||||
        Date callTime = new Date();
 | 
			
		||||
 | 
			
		||||
        HttpServletRequest request = (HttpServletRequest)servletRequest;
 | 
			
		||||
        String ip = request.getRemoteAddr();
 | 
			
		||||
 | 
			
		||||
        String appkey = request.getHeader("appkey");
 | 
			
		||||
        String signature = request.getHeader("signature");
 | 
			
		||||
        String timestamp = request.getHeader("timestamp");
 | 
			
		||||
 | 
			
		||||
        OpenApi openApi = findOpenApi(request);
 | 
			
		||||
 | 
			
		||||
        // IP 黑名单核验
 | 
			
		||||
        checkBlackList(openApi, ip);
 | 
			
		||||
 | 
			
		||||
        // 签名核验
 | 
			
		||||
        checkSignValid(appkey, signature, timestamp);
 | 
			
		||||
 | 
			
		||||
        OpenApiAuth openApiAuth = openApiAuthService.getByAppkey(appkey);
 | 
			
		||||
        // 认证信息核验
 | 
			
		||||
        checkSignature(appkey, signature, timestamp, openApiAuth);
 | 
			
		||||
        // 业务核验
 | 
			
		||||
        checkPermission(openApi, openApiAuth);
 | 
			
		||||
 | 
			
		||||
        filterChain.doFilter(servletRequest, servletResponse);
 | 
			
		||||
        long endTime = System.currentTimeMillis();
 | 
			
		||||
 | 
			
		||||
        OpenApiRecord record = new OpenApiRecord();
 | 
			
		||||
        record.setApiId(openApi.getId());
 | 
			
		||||
        record.setCallAuthId(openApiAuth.getId());
 | 
			
		||||
        record.setCallTime(callTime);
 | 
			
		||||
        record.setUsedTime(endTime - startTime);
 | 
			
		||||
        record.setResponseTime(new Date());
 | 
			
		||||
        openApiRecordService.save(record);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void init(FilterConfig filterConfig) throws ServletException {
 | 
			
		||||
        ServletContext servletContext = filterConfig.getServletContext();
 | 
			
		||||
        WebApplicationContext applicationContext = (WebApplicationContext)servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
 | 
			
		||||
        this.openApiService = applicationContext.getBean(OpenApiService.class);
 | 
			
		||||
        this.openApiRecordService = applicationContext.getBean(OpenApiRecordService.class);
 | 
			
		||||
        this.openApiAuthService = applicationContext.getBean(OpenApiAuthService.class);
 | 
			
		||||
        this.openApiPermissionService = applicationContext.getBean(OpenApiPermissionService.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * IP 黑名单核验
 | 
			
		||||
     * @param openApi
 | 
			
		||||
     * @param ip
 | 
			
		||||
     */
 | 
			
		||||
    protected void checkBlackList(OpenApi openApi, String ip) {
 | 
			
		||||
        if (!StringUtils.hasText(openApi.getBlackList())) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<String> blackList = Arrays.asList(openApi.getBlackList().split(","));
 | 
			
		||||
        if (blackList.contains(ip)) {
 | 
			
		||||
            throw new JeecgBootException("目标接口限制IP[" + ip + "]进行访问,IP已记录,请停止访问");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 签名验证
 | 
			
		||||
     * @param appkey
 | 
			
		||||
     * @param signature
 | 
			
		||||
     * @param timestamp
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    protected void checkSignValid(String appkey, String signature, String timestamp) {
 | 
			
		||||
        if (!StringUtils.hasText(appkey)) {
 | 
			
		||||
            throw new JeecgBootException("appkey为空");
 | 
			
		||||
        }
 | 
			
		||||
        if (!StringUtils.hasText(signature)) {
 | 
			
		||||
            throw new JeecgBootException("signature为空");
 | 
			
		||||
        }
 | 
			
		||||
        if (!StringUtils.hasText(timestamp)) {
 | 
			
		||||
            throw new JeecgBootException("timastamp时间戳为空");
 | 
			
		||||
        }
 | 
			
		||||
        if (!timestamp.matches("[0-9]*")) {
 | 
			
		||||
            throw new JeecgBootException("timastamp时间戳不合法");
 | 
			
		||||
        }
 | 
			
		||||
        if (System.currentTimeMillis() - Long.parseLong(timestamp) > 5 * 60 * 1000) {
 | 
			
		||||
            throw new JeecgBootException("signature签名已过期(超过五分钟)");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 认证信息核验
 | 
			
		||||
     * @param appKey
 | 
			
		||||
     * @param signature
 | 
			
		||||
     * @param timestamp
 | 
			
		||||
     * @param openApiAuth
 | 
			
		||||
     * @return
 | 
			
		||||
     * @throws Exception
 | 
			
		||||
     */
 | 
			
		||||
    protected void checkSignature(String appKey, String signature, String timestamp, OpenApiAuth openApiAuth) {
 | 
			
		||||
        if(openApiAuth==null){
 | 
			
		||||
            throw new JeecgBootException("不存在认证信息");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(!appKey.equals(openApiAuth.getAk())){
 | 
			
		||||
            throw new JeecgBootException("appkey错误");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!signature.equals(md5(appKey + openApiAuth.getSk() + timestamp))) {
 | 
			
		||||
            throw new JeecgBootException("signature签名错误");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void checkPermission(OpenApi openApi, OpenApiAuth openApiAuth) {
 | 
			
		||||
        List<OpenApiPermission> permissionList = openApiPermissionService.findByAuthId(openApiAuth.getId());
 | 
			
		||||
 | 
			
		||||
        boolean hasPermission = false;
 | 
			
		||||
        for (OpenApiPermission permission : permissionList) {
 | 
			
		||||
            if (permission.getApiId().equals(openApi.getId())) {
 | 
			
		||||
                hasPermission = true;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!hasPermission) {
 | 
			
		||||
            throw new JeecgBootException("该appKey未授权当前接口");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return String    返回类型
 | 
			
		||||
     * @Title: MD5
 | 
			
		||||
     * @Description: 【MD5加密】
 | 
			
		||||
     */
 | 
			
		||||
    protected static String md5(String sourceStr) {
 | 
			
		||||
        String result = "";
 | 
			
		||||
        try {
 | 
			
		||||
            MessageDigest md = MessageDigest.getInstance("MD5");
 | 
			
		||||
            md.update(sourceStr.getBytes("utf-8"));
 | 
			
		||||
            byte[] hash = md.digest();
 | 
			
		||||
            int i;
 | 
			
		||||
            StringBuffer buf = new StringBuffer(32);
 | 
			
		||||
            for (int offset = 0; offset < hash.length; offset++) {
 | 
			
		||||
                i = hash[offset];
 | 
			
		||||
                if (i < 0) {
 | 
			
		||||
                    i += 256;
 | 
			
		||||
                }
 | 
			
		||||
                if (i < 16) {
 | 
			
		||||
                    buf.append("0");
 | 
			
		||||
                }
 | 
			
		||||
                buf.append(Integer.toHexString(i));
 | 
			
		||||
            }
 | 
			
		||||
            result = buf.toString();
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            log.error("sign签名错误", e);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected OpenApi findOpenApi(HttpServletRequest request) {
 | 
			
		||||
        String uri = request.getRequestURI();
 | 
			
		||||
        String path = uri.substring(uri.lastIndexOf("/") + 1);
 | 
			
		||||
        return openApiService.findByPath(path);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        long timestamp = System.currentTimeMillis();
 | 
			
		||||
        System.out.println("timestamp:"  + timestamp);
 | 
			
		||||
        System.out.println("signature:" + md5("ak-eAU25mrMxhtaZsyS" + "rjxMqB6YyUXpSHAz4DCIz8vZ5aozQQiV" + timestamp));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
package org.jeecg.modules.openapi.filter;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/19 17:09
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
public class ApiFilterConfig {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * @Description: 【注册api加密过滤器】
 | 
			
		||||
     */
 | 
			
		||||
    @Bean
 | 
			
		||||
    public FilterRegistrationBean<ApiAuthFilter> authFilter() {
 | 
			
		||||
        FilterRegistrationBean<ApiAuthFilter> registration = new FilterRegistrationBean<>();
 | 
			
		||||
        registration.setFilter(new ApiAuthFilter());
 | 
			
		||||
        registration.setName("apiAuthFilter");
 | 
			
		||||
        registration.addUrlPatterns("/openapi/call/*");
 | 
			
		||||
        return registration;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,36 @@
 | 
			
		|||
package org.jeecg.modules.openapi.generator;
 | 
			
		||||
 | 
			
		||||
import java.security.SecureRandom;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * AK/SK生成器
 | 
			
		||||
 */
 | 
			
		||||
public class AKSKGenerator {
 | 
			
		||||
    private static final String CHAR_POOL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
 | 
			
		||||
    private static final int AK_LENGTH = 16; // Adjust as per requirements
 | 
			
		||||
    private static final int SK_LENGTH = 32;
 | 
			
		||||
 | 
			
		||||
    public static String[] genAKSKPair() {
 | 
			
		||||
        return new String[]{genAK(), genSK()};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String genAK() {
 | 
			
		||||
        return "ak-" + generateRandomString(AK_LENGTH);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String genSK() {
 | 
			
		||||
        return generateRandomString(SK_LENGTH);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private static String generateRandomString(int length) {
 | 
			
		||||
        SecureRandom random = new SecureRandom();
 | 
			
		||||
        StringBuilder sb = new StringBuilder(length);
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < length; i++) {
 | 
			
		||||
            sb.append(CHAR_POOL.charAt(random.nextInt(CHAR_POOL.length())));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return sb.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
package org.jeecg.modules.openapi.generator;
 | 
			
		||||
 | 
			
		||||
import lombok.experimental.UtilityClass;
 | 
			
		||||
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 10:00
 | 
			
		||||
 */
 | 
			
		||||
@UtilityClass
 | 
			
		||||
public class PathGenerator {
 | 
			
		||||
 | 
			
		||||
    // Base62字符集
 | 
			
		||||
    private static final String BASE62 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 生成随机路径
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    public static String genPath() {
 | 
			
		||||
        StringBuilder result = new StringBuilder();
 | 
			
		||||
        Random random = new Random();
 | 
			
		||||
        for (int i=0; i<8; i++) {
 | 
			
		||||
            result.append(BASE62.charAt(random.nextInt(62)));
 | 
			
		||||
        }
 | 
			
		||||
        return result.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
package org.jeecg.modules.openapi.mapper;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiAuth;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 9:49
 | 
			
		||||
 */
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface OpenApiAuthMapper extends BaseMapper<OpenApiAuth> {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
package org.jeecg.modules.openapi.mapper;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiHeader;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 14:47
 | 
			
		||||
 */
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface OpenApiHeaderMapper extends BaseMapper<OpenApiHeader> {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
package org.jeecg.modules.openapi.mapper;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApi;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface OpenApiMapper extends BaseMapper<OpenApi> {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
package org.jeecg.modules.openapi.mapper;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiParam;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 14:48
 | 
			
		||||
 */
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface OpenApiParamMapper extends BaseMapper<OpenApiParam> {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
package org.jeecg.modules.openapi.mapper;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiPermission;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/19 17:43
 | 
			
		||||
 */
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface OpenApiPermissionMapper extends BaseMapper<OpenApiPermission> {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
package org.jeecg.modules.openapi.mapper;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiRecord;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 9:50
 | 
			
		||||
 */
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface OpenApiRecordMapper extends BaseMapper<OpenApiRecord> {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiAuth;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 9:50
 | 
			
		||||
 */
 | 
			
		||||
public interface OpenApiAuthService extends IService<OpenApiAuth> {
 | 
			
		||||
    OpenApiAuth getByAppkey(String appkey);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiHeader;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 14:48
 | 
			
		||||
 */
 | 
			
		||||
public interface OpenApiHeaderService extends IService<OpenApiHeader> {
 | 
			
		||||
 | 
			
		||||
    boolean deleteByApiId(String apiId);
 | 
			
		||||
 | 
			
		||||
    List<OpenApiHeader> findByApiId(String apiId);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiParam;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 14:49
 | 
			
		||||
 */
 | 
			
		||||
public interface OpenApiParamService extends IService<OpenApiParam> {
 | 
			
		||||
    boolean deleteByApiId(String apiId);
 | 
			
		||||
 | 
			
		||||
    List<OpenApiParam> findByApiId(String apiId);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiPermission;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/19 17:44
 | 
			
		||||
 */
 | 
			
		||||
public interface OpenApiPermissionService extends IService<OpenApiPermission> {
 | 
			
		||||
    List<OpenApiPermission> findByAuthId(String authId);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiRecord;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 9:51
 | 
			
		||||
 */
 | 
			
		||||
public interface OpenApiRecordService extends IService<OpenApiRecord> {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApi;
 | 
			
		||||
 | 
			
		||||
public interface OpenApiService extends IService<OpenApi> {
 | 
			
		||||
    OpenApi findByPath(String path);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiAuth;
 | 
			
		||||
import org.jeecg.modules.openapi.mapper.OpenApiAuthMapper;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiAuthService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 9:51
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OpenApiAuthServiceImpl extends ServiceImpl<OpenApiAuthMapper, OpenApiAuth> implements OpenApiAuthService {
 | 
			
		||||
    @Override
 | 
			
		||||
    public OpenApiAuth getByAppkey(String appkey) {
 | 
			
		||||
        return baseMapper.selectOne(Wrappers.lambdaUpdate(OpenApiAuth.class).eq(OpenApiAuth::getAk, appkey), false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiHeader;
 | 
			
		||||
import org.jeecg.modules.openapi.mapper.OpenApiHeaderMapper;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiHeaderService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 14:49
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OpenApiHeaderServiceImpl extends ServiceImpl<OpenApiHeaderMapper, OpenApiHeader> implements OpenApiHeaderService {
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean deleteByApiId(String apiId) {
 | 
			
		||||
        return baseMapper.delete(Wrappers.lambdaUpdate(OpenApiHeader.class).eq(OpenApiHeader::getApiId, apiId)) > 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<OpenApiHeader> findByApiId(String apiId) {
 | 
			
		||||
        return baseMapper.selectList(Wrappers.lambdaQuery(OpenApiHeader.class).eq(OpenApiHeader::getApiId, apiId));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiParam;
 | 
			
		||||
import org.jeecg.modules.openapi.mapper.OpenApiParamMapper;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiParamService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 14:50
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OpenApiParamServiceImpl extends ServiceImpl<OpenApiParamMapper, OpenApiParam> implements OpenApiParamService {
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean deleteByApiId(String apiId) {
 | 
			
		||||
        return baseMapper.delete(Wrappers.lambdaUpdate(OpenApiParam.class).eq(OpenApiParam::getApiId, apiId)) > 0;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<OpenApiParam> findByApiId(String apiId) {
 | 
			
		||||
        return baseMapper.selectList(Wrappers.lambdaQuery(OpenApiParam.class).eq(OpenApiParam::getApiId, apiId));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiPermission;
 | 
			
		||||
import org.jeecg.modules.openapi.mapper.OpenApiPermissionMapper;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiPermissionService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/19 17:44
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OpenApiPermissionServiceImpl extends ServiceImpl<OpenApiPermissionMapper, OpenApiPermission> implements OpenApiPermissionService {
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<OpenApiPermission> findByAuthId(String authId) {
 | 
			
		||||
        return baseMapper.selectList(Wrappers.lambdaQuery(OpenApiPermission.class).eq(OpenApiPermission::getApiAuthId, authId));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApiRecord;
 | 
			
		||||
import org.jeecg.modules.openapi.mapper.OpenApiRecordMapper;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiRecordService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2024/12/10 9:53
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OpenApiRecordServiceImpl extends ServiceImpl<OpenApiRecordMapper, OpenApiRecord> implements OpenApiRecordService {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
package org.jeecg.modules.openapi.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.jeecg.modules.openapi.entity.OpenApi;
 | 
			
		||||
import org.jeecg.modules.openapi.mapper.OpenApiMapper;
 | 
			
		||||
import org.jeecg.modules.openapi.service.OpenApiService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
public class OpenApiServiceImpl extends ServiceImpl<OpenApiMapper, OpenApi> implements OpenApiService {
 | 
			
		||||
    @Override
 | 
			
		||||
    public OpenApi findByPath(String path) {
 | 
			
		||||
        return baseMapper.selectOne(Wrappers.lambdaQuery(OpenApi.class).eq(OpenApi::getRequestUrl, path), false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:17
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerDefinition {
 | 
			
		||||
    private String type;
 | 
			
		||||
    private Map<String, SwaggerDefinitionProperties> properties;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 13:54
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerDefinitionProperties {
 | 
			
		||||
    private String type;
 | 
			
		||||
    private String example;
 | 
			
		||||
    private String description;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:05
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerInfo {
 | 
			
		||||
    private String description;
 | 
			
		||||
    private String version;
 | 
			
		||||
    private String title;
 | 
			
		||||
    private String termsOfService;
 | 
			
		||||
    private SwaggerInfoContact contact;
 | 
			
		||||
    private SwaggerInfoLicense license;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:08
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerInfoContact {
 | 
			
		||||
    private String name;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:09
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerInfoLicense {
 | 
			
		||||
    private String name;
 | 
			
		||||
    private String url;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:05
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerModel {
 | 
			
		||||
    private String swagger;
 | 
			
		||||
    private SwaggerInfo info;
 | 
			
		||||
    private String host;
 | 
			
		||||
    private String basePath;
 | 
			
		||||
    private List<SwaggerTag> tags;
 | 
			
		||||
    private List<String> schemes;
 | 
			
		||||
    private Map<String, Map<String, SwaggerOperation>> paths;
 | 
			
		||||
    private Map<String, SwaggerDefinition> definitions;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:16
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerOperation {
 | 
			
		||||
    private List<String> tags;
 | 
			
		||||
    private String summary;
 | 
			
		||||
    private String description;
 | 
			
		||||
    private String operationId;
 | 
			
		||||
    private List<String> produces;
 | 
			
		||||
    private List<SwaggerOperationParameter> parameters;
 | 
			
		||||
    private Map<String, SwaggerOperationResponse> responses;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:43
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerOperationParameter {
 | 
			
		||||
    private String name;
 | 
			
		||||
    private String in;
 | 
			
		||||
    private String description;
 | 
			
		||||
    private Boolean required;
 | 
			
		||||
    private Map<String, String> schema;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:47
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerOperationResponse {
 | 
			
		||||
    private String description;
 | 
			
		||||
    private Map<String, String> schema;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:51
 | 
			
		||||
 */
 | 
			
		||||
public class SwaggerSchema {
 | 
			
		||||
    private String $ref;
 | 
			
		||||
 | 
			
		||||
    public String get$ref() {
 | 
			
		||||
        return $ref;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void set$ref(String $ref) {
 | 
			
		||||
        this.$ref = $ref;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
package org.jeecg.modules.openapi.swagger;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @date 2025/1/26 11:15
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SwaggerTag {
 | 
			
		||||
    private String name;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +15,7 @@ import org.jeecg.common.system.query.QueryGenerator;
 | 
			
		|||
import org.jeecg.common.system.util.JwtUtil;
 | 
			
		||||
import org.jeecg.common.system.vo.LoginUser;
 | 
			
		||||
import org.jeecg.common.util.ImportExcelUtil;
 | 
			
		||||
import org.jeecg.common.util.RedisUtil;
 | 
			
		||||
import org.jeecg.common.util.YouBianCodeUtil;
 | 
			
		||||
import org.jeecg.common.util.oConvertUtils;
 | 
			
		||||
import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
 | 
			
		||||
| 
						 | 
				
			
			@ -65,6 +66,8 @@ public class SysDepartController {
 | 
			
		|||
	private ISysUserService sysUserService;
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private ISysUserDepartService sysUserDepartService;
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private RedisUtil redisUtil;
 | 
			
		||||
	/**
 | 
			
		||||
	 * 查询数据 查出我的部门,并以树结构数据格式响应给前端
 | 
			
		||||
	 *
 | 
			
		||||
| 
						 | 
				
			
			@ -470,8 +473,8 @@ public class SysDepartController {
 | 
			
		|||
				//update-end---author:wangshuai---date:2023-10-19---for:【QQYUN-5482】系统的部门导入导出也可以改成敲敲云模式的部门路径---
 | 
			
		||||
				
 | 
			
		||||
				//清空部门缓存
 | 
			
		||||
				Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*");
 | 
			
		||||
				Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*");
 | 
			
		||||
				List<String> keys3 = redisUtil.scan(CacheConstant.SYS_DEPARTS_CACHE + "*");
 | 
			
		||||
				List<String> keys4 = redisUtil.scan(CacheConstant.SYS_DEPART_IDS_CACHE + "*");
 | 
			
		||||
				redisTemplate.delete(keys3);
 | 
			
		||||
				redisTemplate.delete(keys4);
 | 
			
		||||
				return ImportExcelUtil.imporReturnRes(errorMessageList.size(), listSysDeparts.size() - errorMessageList.size(), errorMessageList);
 | 
			
		||||
| 
						 | 
				
			
			@ -664,8 +667,8 @@ public class SysDepartController {
 | 
			
		|||
				listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), ExportDepartVo.class, params);
 | 
			
		||||
				sysDepartService.importExcel(listSysDeparts,errorMessageList);
 | 
			
		||||
				//清空部门缓存
 | 
			
		||||
				Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*");
 | 
			
		||||
				Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*");
 | 
			
		||||
				List<String> keys3 = redisUtil.scan(CacheConstant.SYS_DEPARTS_CACHE + "*");
 | 
			
		||||
				List<String> keys4 = redisUtil.scan(CacheConstant.SYS_DEPART_IDS_CACHE + "*");
 | 
			
		||||
				redisTemplate.delete(keys3);
 | 
			
		||||
				redisTemplate.delete(keys4);
 | 
			
		||||
				return ImportExcelUtil.imporReturnRes(errorMessageList.size(), listSysDeparts.size() - errorMessageList.size(), errorMessageList);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ public class SysUserOnlineController {
 | 
			
		|||
    @RequestMapping(value = "/list", method = RequestMethod.GET)
 | 
			
		||||
    public Result<Page<SysUserOnlineVO>> list(@RequestParam(name="username", required=false) String username,
 | 
			
		||||
                                              @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,@RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
 | 
			
		||||
        Collection<String> keys = redisTemplate.keys(CommonConstant.PREFIX_USER_TOKEN + "*");
 | 
			
		||||
        Collection<String> keys = redisUtil.scan(CommonConstant.PREFIX_USER_TOKEN + "*");
 | 
			
		||||
        List<SysUserOnlineVO> onlineList = new ArrayList<SysUserOnlineVO>();
 | 
			
		||||
        for (String key : keys) {
 | 
			
		||||
            String token = (String)redisUtil.get(key);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -178,7 +178,7 @@ spring:
 | 
			
		|||
    database: 0
 | 
			
		||||
    host: 127.0.0.1
 | 
			
		||||
    port: 6379
 | 
			
		||||
    password: ''
 | 
			
		||||
    password:
 | 
			
		||||
#mybatis plus 设置
 | 
			
		||||
mybatis-plus:
 | 
			
		||||
  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue