diff --git a/pom.xml b/pom.xml index 984b2c986ac5fdaf6ee1205d6aeb6bdaae138421..865d10eb43d4afa68bd6df8d828ec99fdfbf6a10 100644 --- a/pom.xml +++ b/pom.xml @@ -361,9 +361,9 @@ roncoo-education-course - roncoo-education-crontab-plan + roncoo-education-job - roncoo-education-gateway-api + roncoo-education-gateway roncoo-education-web-boss diff --git a/roncoo-education-crontab-plan/pom.xml b/roncoo-education-crontab-plan/pom.xml deleted file mode 100644 index 8ad119e3a9f01e5eb53c6faf11d8c1f21fe678b8..0000000000000000000000000000000000000000 --- a/roncoo-education-crontab-plan/pom.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - 4.0.0 - - - com.roncoo - roncoo-education - 3.0.0-SNAPSHOT - - - roncoo-education-crontab-plan - - roncoo-education-crontab-plan - - - - - com.roncoo - roncoo-education-course-feign - - - - com.roncoo - roncoo-education-user-feign - - - - com.roncoo - roncoo-education-system-feign - - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix - - - org.springframework.cloud - spring-cloud-starter-config - - - - org.springframework.boot - spring-boot-devtools - - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - crontab-plan - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/CrontabPlanApplication.java b/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/CrontabPlanApplication.java deleted file mode 100644 index 8d96c273f586bafe796c001491ce5197ee1ed991..0000000000000000000000000000000000000000 --- a/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/CrontabPlanApplication.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright 2015-现在 广州市领课网络科技有限公司 - */ -package com.roncoo.education; - -import org.springframework.boot.SpringApplication; -import org.springframework.cloud.client.SpringCloudApplication; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.scheduling.annotation.EnableScheduling; - -/** - * 定时任务 - */ -@EnableScheduling -@EnableFeignClients -@SpringCloudApplication -public class CrontabPlanApplication { - - public static void main(String[] args) { - SpringApplication.run(CrontabPlanApplication.class, args); - } - -} diff --git a/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/crontab/MsgSendCrontab.java b/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/crontab/MsgSendCrontab.java deleted file mode 100644 index 5b9f19d2198017bf9b219395c48ec350f194364b..0000000000000000000000000000000000000000 --- a/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/crontab/MsgSendCrontab.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.roncoo.education.crontab; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import com.roncoo.education.system.feign.IBossMsg; -import com.roncoo.education.util.base.BaseController; - -/** - * 站内信-定时发送 - * - * @author wuyun - * - */ -@Component -public class MsgSendCrontab extends BaseController { - - private static final Object KEY = new Object(); - private static boolean taskFlag = false; - - @Autowired - private IBossMsg bossMsg; - - /** - * 定时任务,一小时启动一次 - * - * @author wuyun - */ - @Scheduled(fixedRate = 60000) - public void pushCancel() { - synchronized (KEY) { - if (MsgSendCrontab.taskFlag) { - logger.warn("站内信-定时发送已经启动"); - return; - } - MsgSendCrontab.taskFlag = true; - } - - try { - bossMsg.push(); - } catch (Exception e) { - logger.error("站内信-定时发送-执行出错", e); - } - - MsgSendCrontab.taskFlag = false; - - logger.warn("站内信-定时发送-任务完成"); - } -} diff --git a/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/crontab/OrderCrontab.java b/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/crontab/OrderCrontab.java deleted file mode 100644 index 16bf077959bb28998163509bc58877a8bd796e82..0000000000000000000000000000000000000000 --- a/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/crontab/OrderCrontab.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.roncoo.education.crontab; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import com.roncoo.education.course.feign.IBossOrderInfo; -import com.roncoo.education.util.base.BaseController; - -/** - * 定时任务-订单处理 - * - * @author wuyun - */ -@Component -public class OrderCrontab extends BaseController { - - private static final Object KEY = new Object(); - - private static boolean taskFlag = false; - - @Autowired - private IBossOrderInfo bossOrderInfo; - - /** - * 定时任务每分钟执行一次 - */ - @Scheduled(fixedRate = 60000) - public void orderCancel() { - synchronized (KEY) { - if (OrderCrontab.taskFlag) { - logger.warn("订单处理-任务已经启动"); - return; - } - OrderCrontab.taskFlag = true; - } - logger.warn("订单处理-定时任务开始"); - - try { - bossOrderInfo.handleScheduledTasks(); - } catch (Exception e) { - logger.error("定时任务-订单处理-执行出错", e); - } - OrderCrontab.taskFlag = false; - } - -} diff --git a/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/crontab/VideoCrontab.java b/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/crontab/VideoCrontab.java deleted file mode 100644 index f2cdd4092c69d50e6e757b324b66d86036a5d529..0000000000000000000000000000000000000000 --- a/roncoo-education-crontab-plan/src/main/java/com/roncoo/education/crontab/VideoCrontab.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.roncoo.education.crontab; - -import java.io.File; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import com.roncoo.education.course.feign.IBossCourseVideo; -import com.roncoo.education.util.base.BaseController; -import com.roncoo.education.util.config.SystemUtil; -import com.xiaoleilu.hutool.io.FileUtil; - -/** - * 定时任务-视频处理 - * - * @author wuyun - */ -@Component -public class VideoCrontab extends BaseController { - - private static final Object KEY = new Object(); - private static boolean taskFlag = false; - - @Autowired - private IBossCourseVideo bossCourseVideo; - - /** - * 定时任务每分钟执行一次
- * 注意:每个course服务都必须要对应有一个定时任务,针对服务器 - */ - @Scheduled(fixedRate = 60000) - public void orderCancel() { - synchronized (KEY) { - if (VideoCrontab.taskFlag) { - logger.warn("视频处理-任务已经启动"); - return; - } - VideoCrontab.taskFlag = true; - } - - int videoSum = 0; - - File file = new File(SystemUtil.PERIOD_VIDEO_PATH); - if (file.isDirectory()) {// isDirectory是否文件夹 - File[] files = file.listFiles();// listFiles是获取该目录下所有文件和目录的绝对路径 - for (File targetFile : files) { - - if (targetFile.isFile() && targetFile.exists()) { - if (FileUtil.newerThan(targetFile, (System.currentTimeMillis() - 7200000))) {// 上传两个小时内 - - try { - bossCourseVideo.handleScheduledTasks(targetFile); - videoSum = videoSum + 1; - } catch (Exception e) { - logger.error("视频定时任务处理失败", e); - } - - } - } - } - } - - VideoCrontab.taskFlag = false; - - logger.warn("视频处理-定时任务完成,处理视频数={}", videoSum); - } - -} diff --git a/roncoo-education-crontab-plan/src/main/resources/bootstrap.properties b/roncoo-education-crontab-plan/src/main/resources/bootstrap.properties deleted file mode 100644 index 9fd6bc4ac7f92bba9ccd202fb7452964fefc8112..0000000000000000000000000000000000000000 --- a/roncoo-education-crontab-plan/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,21 +0,0 @@ -# info -info.eureka.host=localhost -info.eureka.port=5761 - -# profile -spring.profiles.active=dev - -# eureka -eureka.client.serviceUrl.defaultZone=http://${info.eureka.host}:${info.eureka.port}/eureka/ - -# server -server.port=5910 - -# application -spring.application.name=roncoo-education-crontab-plan - -# spring cloud config client -spring.cloud.config.profile=${spring.profiles.active} -spring.cloud.config.label=master -spring.cloud.config.discovery.enabled=true -spring.cloud.config.discovery.service-id=roncoo-education-server-config diff --git a/roncoo-education-gateway-api/pom.xml b/roncoo-education-gateway-api/pom.xml deleted file mode 100644 index ec27d0258ab7fafda36e3587b6a965040290589c..0000000000000000000000000000000000000000 --- a/roncoo-education-gateway-api/pom.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - 4.0.0 - - - com.roncoo - roncoo-education - 3.0.0-SNAPSHOT - - - roncoo-education-gateway-api - - roncoo-education-gateway-api - - - - - com.roncoo - roncoo-education-util - - - - org.springframework.boot - spring-boot-starter-freemarker - - - - org.springframework.cloud - spring-cloud-starter-netflix-zuul - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-devtools - - - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix - - - - org.springframework.cloud - spring-cloud-starter-config - - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - gateway-api - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/GatewayApiApplication.java b/roncoo-education-gateway-api/src/main/java/com/roncoo/education/GatewayApiApplication.java deleted file mode 100644 index c34517cc381d6f715b824ef7ce459d5b6d70f27c..0000000000000000000000000000000000000000 --- a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/GatewayApiApplication.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright 2015-现在 广州市领课网络科技有限公司 - */ -package com.roncoo.education; - -import org.springframework.boot.SpringApplication; -import org.springframework.cloud.client.SpringCloudApplication; -import org.springframework.cloud.netflix.zuul.EnableZuulProxy; -import org.springframework.context.annotation.Bean; - -import com.roncoo.education.gateway.api.common.FilterError; -import com.roncoo.education.gateway.api.common.FilterPost; -import com.roncoo.education.gateway.api.common.FilterPre; - -/** - * 服务网关 - * - * @author wujing - */ -@EnableZuulProxy -@SpringCloudApplication -public class GatewayApiApplication { - - public static void main(String[] args) { - SpringApplication.run(GatewayApiApplication.class, args); - } - - @Bean - public FilterError filterError() { - return new FilterError(); - } - - @Bean - public FilterPre filterPre() { - return new FilterPre(); - } - - @Bean - public FilterPost filterPost() { - return new FilterPost(); - } - -} diff --git a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/common/FilterError.java b/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/common/FilterError.java deleted file mode 100644 index fafc10db6fdabd41f833aa6a4421942090330de0..0000000000000000000000000000000000000000 --- a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/common/FilterError.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright 2015-现在 广州市领课网络科技有限公司 - */ -package com.roncoo.education.gateway.api.common; - -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; - -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; -import com.roncoo.education.util.base.Result; -import com.roncoo.education.util.tools.JSONUtil; - -/** - * 出现错误时执行 - */ -public class FilterError extends ZuulFilter { - - private static final Logger logger = LoggerFactory.getLogger(FilterError.class); - - @Override - public String filterType() { - return FilterConstants.ERROR_TYPE; - } - - @Override - public int filterOrder() { - return -1; - } - - @Override - public boolean shouldFilter() { - return true; - } - - @Override - public Object run() { - RequestContext ctx = RequestContext.getCurrentContext(); - Throwable throwable = ctx.getThrowable(); - if (throwable != null) { - logger.warn(ReflectionToStringBuilder.toString(throwable, ToStringStyle.MULTI_LINE_STYLE)); - - ctx.getResponse().setCharacterEncoding("UTF-8"); - ctx.setResponseBody(JSONUtil.toJSONString(Result.error("系统异常"))); - } - return null; - } - -} diff --git a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/common/FilterPost.java b/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/common/FilterPost.java deleted file mode 100644 index d67b1968f92130fa72109ce327baf0431300375d..0000000000000000000000000000000000000000 --- a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/common/FilterPost.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright 2015-现在 广州市领课网络科技有限公司 - */ -package com.roncoo.education.gateway.api.common; - -import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; - -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; -import com.roncoo.education.util.base.Result; -import com.roncoo.education.util.tools.JSONUtil; - -/** - * 请求处理完成后执行 - */ -public class FilterPost extends ZuulFilter { - - @Override - public String filterType() { - return FilterConstants.POST_TYPE; - } - - @Override - public int filterOrder() { - return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1; - } - - @Override - public boolean shouldFilter() { - RequestContext ctx = RequestContext.getCurrentContext(); - // 异常处理 - if (ctx.getResponseStatusCode() != 200) { - ctx.getResponse().setCharacterEncoding("UTF-8"); - ctx.setResponseBody(JSONUtil.toJSONString(Result.error(99, "服务异常,请重试"))); - } - return false; - } - - @Override - public Object run() { - return null; - } - -} diff --git a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/common/FilterPre.java b/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/common/FilterPre.java deleted file mode 100644 index a91c2c315c1b0ca140f1ca38d4d2d961c5cfa4d9..0000000000000000000000000000000000000000 --- a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/common/FilterPre.java +++ /dev/null @@ -1,223 +0,0 @@ -/** - * Copyright 2015-现在 广州市领课网络科技有限公司 - */ -package com.roncoo.education.gateway.api.common; - -import java.io.BufferedReader; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.Map; -import java.util.TreeMap; -import java.util.concurrent.TimeUnit; - -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.util.StringUtils; - -import com.auth0.jwt.interfaces.DecodedJWT; -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; -import com.netflix.zuul.http.ServletInputStreamWrapper; -import com.roncoo.education.util.base.BaseException; -import com.roncoo.education.util.base.Result; -import com.roncoo.education.util.enums.ResultEnum; -import com.roncoo.education.util.tools.JSONUtil; -import com.roncoo.education.util.tools.JWTUtil; - -/** - * 请求开始前执行 - */ -public class FilterPre extends ZuulFilter { - - private static final Logger logger = LoggerFactory.getLogger(FilterPre.class); - private static final String TOKEN = "token"; - - @Autowired - private StringRedisTemplate stringRedisTemplate; - - @Override - public String filterType() { - return FilterConstants.PRE_TYPE; - } - - @Override - public int filterOrder() { - return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1; - } - - @Override - public boolean shouldFilter() { - String uri = RequestContext.getCurrentContext().getRequest().getServletPath(); - - if (uri.startsWith("/callback")) { - // 回调使用 - return false; - } - - if (uri.startsWith("/zuul")) { - // 文件上传 - return false; - } - - if (!uri.startsWith("/auth")) { - // 非token校验 - return false; - } - - return true; - } - - @Override - public Object run() { - RequestContext ctx = RequestContext.getCurrentContext(); - HttpServletRequest request = ctx.getRequest(); - Long userNo = null; - try { - userNo = getUserNoByToken(request); - } catch (BaseException e) { - logger.error("系统异常", e.getMessage()); - resp(ctx, e.getMessage(), e.getCode()); - } - - // 参数封装 - try { - ctx.setRequest(requestWrapper(request, userNo)); - } catch (IOException e) { - logger.error("封装参数异常", e.getMessage()); - resp(ctx, "系统异常,请重试"); - } - - return null; - } - - /** - * token 拦截功能 - */ - private Long getUserNoByToken(HttpServletRequest request) { - String token = request.getHeader(TOKEN); // 检验token - if (StringUtils.isEmpty(token)) { // token不存在,则从报文里面获取 - throw new BaseException("token不存在,请重新登录"); - } - - // 解析 token - DecodedJWT jwt = null; - try { - jwt = JWTUtil.verify(token); - } catch (Exception e) { - logger.error("token异常,token={}", token.toString()); - throw new BaseException(ResultEnum.TOKEN_ERROR); - } - - // 校验token - if (null == jwt) { - throw new BaseException(ResultEnum.TOKEN_ERROR); - } - Long userNo = JWTUtil.getUserNo(jwt); - if (userNo <= 0) { - throw new BaseException(ResultEnum.TOKEN_ERROR); - } - - // 单点登录处理,注意,登录的时候必须要放入缓存 - /*if (!stringRedisTemplate.hasKey(userNo.toString())) { - // 不存在,则登录异常,有效期为1小时 - throw new BaseException(ResultEnum.TOKEN_PAST); - } - - // 存在,判断是否token相同 - String tk = stringRedisTemplate.opsForValue().get(userNo.toString()); - if (!token.equals(tk)) { - // 不同则为不同的用户登录,这时候提示异地登录 - throw new BaseException(ResultEnum.REMOTE_ERROR); - }*/ - - // 更新时间,使token不过期 - stringRedisTemplate.opsForValue().set(userNo.toString(), token, 1, TimeUnit.HOURS); - - return userNo; - } - - private HttpServletRequestWrapper requestWrapper(HttpServletRequest request, Long userNo) throws IOException { - Map map = getParamMap(request); - if (null == map) { - map = new HashMap<>(); - } - if (userNo != null) { - map.put("userNo", userNo); - } - String newBody = JSONUtil.toJSONString(map); - logger.info("转发参数={}", newBody); - final byte[] reqBodyBytes = newBody.getBytes(); - return new HttpServletRequestWrapper(request) { - - @Override - public BufferedReader getReader() throws IOException { - return new BufferedReader(new InputStreamReader(getInputStream())); - } - - @Override - public ServletInputStream getInputStream() throws IOException { - return new ServletInputStreamWrapper(reqBodyBytes); - } - - @Override - public int getContentLength() { - return reqBodyBytes.length; - } - - @Override - public long getContentLengthLong() { - return reqBodyBytes.length; - } - }; - } - - private void resp(RequestContext ctx, String msg) { - ctx.getResponse().setCharacterEncoding("UTF-8"); - ctx.setResponseBody(JSONUtil.toJSONString(Result.error(msg))); - } - - private void resp(RequestContext ctx, String msg, int code) { - ctx.getResponse().setCharacterEncoding("UTF-8"); - ctx.setResponseBody(JSONUtil.toJSONString(Result.error(code, msg))); - } - - @SuppressWarnings("unchecked") - private static TreeMap getParamMap(HttpServletRequest request) { - TreeMap paramMap = new TreeMap<>(); - Map map = request.getParameterMap(); - for (String key : map.keySet()) { - paramMap.put(key, map.get(key)[0]); - } - if (paramMap.isEmpty()) { - DataInputStream in = null; - try { - in = new DataInputStream(request.getInputStream()); - byte[] buf = new byte[request.getContentLength()]; - in.readFully(buf); - String t = new String(buf, "UTF-8"); - if (StringUtils.hasText(t)) { - return new TreeMap<>(JSONUtil.parseObject(t, TreeMap.class)); - } - } catch (Exception e) { - logger.warn("获取不到任何参数"); - } finally { - if (null != in) - try { - in.close();// 关闭数据流 - } catch (IOException e) { - } - } - } - return paramMap; - } - -} diff --git a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/controller/IndexController.java b/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/controller/IndexController.java deleted file mode 100644 index 21142396d8b2c328a7d0ba7e4b5cd0228e1259f0..0000000000000000000000000000000000000000 --- a/roncoo-education-gateway-api/src/main/java/com/roncoo/education/gateway/api/controller/IndexController.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright 2015-现在 广州市领课网络科技有限公司 - */ -package com.roncoo.education.gateway.api.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -@Controller -public class IndexController { - - @RequestMapping(value = "/", method = RequestMethod.GET) - public String index() { - return "index"; - } - -} diff --git a/roncoo-education-gateway-api/src/main/resources/bootstrap.properties b/roncoo-education-gateway-api/src/main/resources/bootstrap.properties deleted file mode 100644 index 2395106937cda2678f9265234c8e976e6d2a5ccf..0000000000000000000000000000000000000000 --- a/roncoo-education-gateway-api/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,21 +0,0 @@ -# info -info.eureka.host=localhost -info.eureka.port=5761 - -# profile -spring.profiles.active=dev - -# eureka -eureka.client.serviceUrl.defaultZone=http://${info.eureka.host}:${info.eureka.port}/eureka/ - -# server -server.port=5840 - -# application -spring.application.name=roncoo-education-gateway-api - -# spring cloud config client -spring.cloud.config.profile=${spring.profiles.active} -spring.cloud.config.label=master -spring.cloud.config.discovery.enabled=true -spring.cloud.config.discovery.service-id=roncoo-education-server-config diff --git a/roncoo-education-gateway-api/src/main/resources/templates/index.ftl b/roncoo-education-gateway-api/src/main/resources/templates/index.ftl deleted file mode 100644 index ae684ea52872ba77e2ecbccb18ed393574d8d310..0000000000000000000000000000000000000000 --- a/roncoo-education-gateway-api/src/main/resources/templates/index.ftl +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 接口文档 - - -
-
- 课程API -
-
- 用户API -
-
- 系统API -
- - \ No newline at end of file