methods = aClass.getMethods();
+ for (AnnotatedMethod method : methods) {
+ if (method.getMethodName().equals(namedMethod.getName())) {
+ return method;
+ }
+ }
+ }
+ return null;
+ }
+
+
+ public AnnotatedMethod getAnnotatedMethod(Class> clazz, Method method) {
+ return getAnnotatedMethod(clazz.getCanonicalName(),new NamedMethod(method));
+ }
+
+ public AnnotatedMethod getAnnotatedMethod(Method method) {
+ return getAnnotatedMethod(method.getDeclaringClass(),method);
+ }
+
+
+
+ public Comment getMethodComment(Method method) {
+ return parseDoc(getAnnotatedMethod(method).getDoc());
+ }
+
+
+ public static Comment parseDoc(String doc) {
+ Comment comment = new Comment();
+ if (doc == null || "".equals(doc.trim())) {
+ return comment;
+ }
+ String[] str = doc.split(NEWLINE_STRING);
+ int status = STATUS_COMMENT;
+ String temp = "";
+ for (String line : str) {
+ line = line.trim();
+ if ("".equals(line)) {
+ continue;
+ }
+ if (line.startsWith(SEPARATE_STRING)) {
+ int i = line.indexOf(SPACE_STRING);
+ String sp = line.substring(i + 1).trim();
+ if (line.startsWith(PARAM_STRING)) {
+ status = STATUS_PARAM;
+ int dx = sp.indexOf(SPACE_STRING);
+ String param = sp.substring(0, dx);
+ String desc = sp.substring(dx + 1).trim();
+ comment.addParam(param, desc);
+ temp = param;
+ } else if (line.startsWith(RETURN_STRING)) {
+ status = STATUS_RETURN;
+ comment.setRet(sp);
+ } else if (line.startsWith(DEMORESPONSE_STRING)) {
+ status = STATUS_DEMORESPONSE;
+ comment.setDemoResponse(sp);
+ }else {
+ status=STATUS_OTHER;
+ }
+ } else {
+ switch (status) {
+ case STATUS_COMMENT:
+ String cmt = comment.getComment() + SPACE_STRING + line;
+ comment.setComment(cmt.trim());
+ break;
+ case STATUS_PARAM:
+ String desc = comment.getParam(temp) + SPACE_STRING + line;
+ comment.addParam(temp, desc.trim());
+ break;
+ case STATUS_DEMORESPONSE:
+ String dr = comment.getDemoResponse() + SPACE_STRING + line;
+ comment.setDemoResponse(dr.trim());
+ break;
+ case STATUS_RETURN:
+ String ret = comment.getRet() + SPACE_STRING + line;
+ comment.setRet(ret.trim());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return comment;
+ }
+
+
+
+ static class NamedMethod{
+
+ Method method;
+
+
+ NamedMethod(Method method){
+ this.method=method;
+ }
+
+ String getName(){
+ StringBuilder sb=new StringBuilder();
+ sb.append(method.getName()).append("(");
+ String[] parameterNames = Utils.getParameterNames(method);
+ for (String paramName:parameterNames){
+ sb.append(paramName).append(",");
+ }
+ int i = sb.length() - 1;
+ if (sb.charAt(i)==','){
+ sb.deleteCharAt(i);
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+ }
+
+ public static void main(String[] args) {
+ System.out.println(parseDoc(" 导航菜单\n @demoResponse {djjdjd}\n @return hdhdhd\n\n"));
+
+
+ }
+
+
+ public static String doc = "Returns the leading surrogate (a\n" +
+ " \n" +
+ " high surrogate code unit) of the\n" +
+ " \n" +
+ " surrogate pair\n" +
+ " representing the specified supplementary character (Unicode\n" +
+ " code point) in the UTF-16 encoding. If the specified character\n" +
+ " is not a\n" +
+ " supplementary character,\n" +
+ " an unspecified {@code char} is returned.\n" +
+ " \n" +
+ " If\n" +
+ " {@link #isSupplementaryCodePoint isSupplementaryCodePoint(x)}\n" +
+ " is {@code true}, then\n" +
+ " {@link #isHighSurrogate isHighSurrogate}{@code (highSurrogate(x))} and\n" +
+ " {@link #toCodePoint toCodePoint}{@code (highSurrogate(x), }{@link #lowSurrogate lowSurrogate}{@code (x)) == x}\n" +
+ " are also always {@code true}.\n" +
+ " \n" +
+ " @param codePoint a supplementary character (Unicode code point)\n" +
+ " @return the leading surrogate code unit used to represent the\n" +
+ " character in the UTF-16 encoding\n" +
+ " @since 1.7";
+}
diff --git a/src/main/java/com/github/llchen/apidoc/process/DocCommentProcessor.java b/src/main/java/com/github/llchen/apidoc/process/DocCommentProcessor.java
new file mode 100644
index 0000000..0babb29
--- /dev/null
+++ b/src/main/java/com/github/llchen/apidoc/process/DocCommentProcessor.java
@@ -0,0 +1,211 @@
+package com.github.llchen.apidoc.process;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+
+
+import javax.annotation.processing.*;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.util.Elements;
+import javax.tools.Diagnostic;
+import javax.tools.FileObject;
+import javax.tools.StandardLocation;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author llchen12
+ * @date 2018/6/26
+ */
+@SupportedAnnotationTypes({"*"})
+public class DocCommentProcessor extends AbstractProcessor {
+
+
+ static final String METADATA_PATH = "META-INF/doc-comment.json";
+
+ static final String RESTCONTROLLER_ANNOTATION = "org.springframework.web.bind.annotation.RestController";
+
+ static final String CONTROLLER_ANNOTATION = "org.springframework.stereotype.Controller";
+
+ static final String REQUESTMAPPING_ANNOTATION = "org.springframework.web.bind.annotation.RequestMapping";
+
+ static final String GETMAPPING_ANNOTATION = "org.springframework.web.bind.annotation.GetMapping";
+
+ static final String POSTMAPPING_ANNOTATION = "org.springframework.web.bind.annotation.PostMapping";
+
+ static final String PUTMAPPING_ANNOTATION = "org.springframework.web.bind.annotation.PutMapping";
+
+ static final String DELETEMAPPING_ANNOTATION = "org.springframework.web.bind.annotation.DeleteMapping";
+
+ //private static final Map> ANNOTATION_CLASS_MAP = new HashMap<>(16);
+
+ private Elements elementUtils;
+ private Messager messager;
+ private Filer filer;
+
+ private Map docClassMap = new HashMap<>(64);
+
+ @Override
+ public synchronized void init(ProcessingEnvironment processingEnv) {
+ super.init(processingEnv);
+ this.elementUtils = processingEnv.getElementUtils();
+ this.messager = processingEnv.getMessager();
+ this.filer = processingEnv.getFiler();
+ }
+
+ @Override
+ public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv) {
+
+ Set docClassSet = new HashSet<>(64);
+ TypeElement restControllerEle = elementUtils.getTypeElement(RESTCONTROLLER_ANNOTATION);
+ if (restControllerEle != null) {
+ docClassSet.addAll(roundEnv.getElementsAnnotatedWith(restControllerEle));
+ }
+ TypeElement controllerEle = elementUtils.getTypeElement(CONTROLLER_ANNOTATION);
+ if (controllerEle != null) {
+ docClassSet.addAll(roundEnv.getElementsAnnotatedWith(controllerEle));
+ }
+
+ processDocClasses(docClassSet);
+
+ Set docMethodSet = new HashSet<>(128);
+ TypeElement requestMappingEle = elementUtils.getTypeElement(REQUESTMAPPING_ANNOTATION);
+ if (requestMappingEle != null) {
+ docMethodSet.addAll(roundEnv.getElementsAnnotatedWith(requestMappingEle));
+ }
+ TypeElement getMappingEle = elementUtils.getTypeElement(GETMAPPING_ANNOTATION);
+ if (requestMappingEle != null) {
+ docMethodSet.addAll(roundEnv.getElementsAnnotatedWith(getMappingEle));
+ }
+ TypeElement postMappingEle = elementUtils.getTypeElement(POSTMAPPING_ANNOTATION);
+ if (requestMappingEle != null) {
+ docMethodSet.addAll(roundEnv.getElementsAnnotatedWith(postMappingEle));
+ }
+ TypeElement putMappingEle = elementUtils.getTypeElement(PUTMAPPING_ANNOTATION);
+ if (requestMappingEle != null) {
+ docMethodSet.addAll(roundEnv.getElementsAnnotatedWith(putMappingEle));
+ }
+ TypeElement deleteMappingEle = elementUtils.getTypeElement(DELETEMAPPING_ANNOTATION);
+ if (requestMappingEle != null) {
+ docMethodSet.addAll(roundEnv.getElementsAnnotatedWith(deleteMappingEle));
+ }
+
+ processDocMethods(docMethodSet);
+
+ if (roundEnv.processingOver()) {
+ try {
+ writeData();
+ } catch (IOException e) {
+ messager.printMessage(Diagnostic.Kind.WARNING, "Failed to write metadata " + e.getMessage());
+ }
+ }
+
+ return false;
+ }
+
+ private void processDocMethods(Set docMethodSet) {
+ for (Element ele : docMethodSet) {
+ if (ele.getKind() != ElementKind.METHOD) {
+ continue;
+ }
+ AnnotatedMethod method = new AnnotatedMethod((ExecutableElement) ele, elementUtils.getDocComment(ele));
+ String className = method.getClassName();
+ AnnotatedClass aClass = docClassMap.get(className);
+ if (aClass == null) {
+ Element parent = ele.getEnclosingElement();
+ aClass = new AnnotatedClass(className, elementUtils.getDocComment(parent));
+ aClass.addMethod(method);
+ docClassMap.put(className, aClass);
+ } else {
+ aClass.addMethod(method);
+ }
+ }
+ }
+
+ private void processDocClasses(Set docClassSet) {
+ for (Element ele : docClassSet) {
+ if (ele.getKind() != ElementKind.CLASS) {
+ continue;
+ }
+ String className = ((TypeElement) ele).getQualifiedName().toString();
+ if (!docClassMap.containsKey(className)) {
+ AnnotatedClass annotatedClass = new AnnotatedClass(className, elementUtils.getDocComment(ele));
+ docClassMap.put(className, annotatedClass);
+ }
+ }
+ }
+
+
+ private void writeData() throws IOException {
+ if (docClassMap.isEmpty()) {
+ return;
+ }
+ FileObject resource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", METADATA_PATH);
+ try (OutputStream outputStream = resource.openOutputStream()) {
+ String json = JSON.toJSONString(docClassMap, SerializerFeature.PrettyFormat,
+ SerializerFeature.SkipTransientField);
+ outputStream.write(json.getBytes("UTF-8"));
+ }
+ }
+
+// private void processMethod(ExecutableElement ele) {
+// if (hasAnyAnnotation(ele, REQUESTMAPPING_ANNOTATION, GETMAPPING_ANNOTATION, POSTMAPPING_ANNOTATION,
+// DELETEMAPPING_ANNOTATION, PUTMAPPING_ANNOTATION)) {
+//
+// }
+// }
+//
+// private void processClass(TypeElement ele) {
+// //处理@Controller和@RestController注解
+// if (hasAnyAnnotation(ele, CONTROLLER_ANNOTATION, RESTCONTROLLER_ANNOTATION)) {
+//
+// }
+// }
+
+// protected boolean hasAnnotation(Element e, String annotationClassName) {
+// Class annotation = getAnnotationClass(annotationClassName);
+// return annotation != null && e.getAnnotation(annotation) != null;
+// }
+//
+// protected boolean hasAnyAnnotation(Element e, String... annotationClassNames) {
+// if (annotationClassNames == null || annotationClassNames.length == 0) {
+// return false;
+// }
+//
+// for (String name : annotationClassNames) {
+// if (hasAnnotation(e, name)) {
+// return true;
+// }
+// }
+// return false;
+// }
+//
+// @SuppressWarnings("unchecked")
+// protected Class getAnnotationClass(String annotationClassName) {
+// Class> aClass = ANNOTATION_CLASS_MAP.get(annotationClassName);
+// if (aClass == null) {
+// try {
+// aClass = Class.forName(annotationClassName);
+// ANNOTATION_CLASS_MAP.put(annotationClassName, aClass);
+// } catch (ClassNotFoundException e) {
+// messager.printMessage(Diagnostic.Kind.WARNING, annotationClassName + "不存在");
+// return null;
+// }
+// }
+// return (Class) aClass;
+// }
+
+
+ @Override
+ public SourceVersion getSupportedSourceVersion() {
+ return SourceVersion.latestSupported();
+ }
+}
diff --git a/src/main/java/io/github/llchen/apidoc/utils/GenUtil.java b/src/main/java/com/github/llchen/apidoc/utils/GenUtil.java
similarity index 97%
rename from src/main/java/io/github/llchen/apidoc/utils/GenUtil.java
rename to src/main/java/com/github/llchen/apidoc/utils/GenUtil.java
index a1befde..7f76d95 100644
--- a/src/main/java/io/github/llchen/apidoc/utils/GenUtil.java
+++ b/src/main/java/com/github/llchen/apidoc/utils/GenUtil.java
@@ -1,4 +1,4 @@
-package io.github.llchen.apidoc.utils;
+package com.github.llchen.apidoc.utils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
diff --git a/src/main/java/io/github/llchen/apidoc/utils/MarkdownEntity.java b/src/main/java/com/github/llchen/apidoc/utils/MarkdownEntity.java
similarity index 98%
rename from src/main/java/io/github/llchen/apidoc/utils/MarkdownEntity.java
rename to src/main/java/com/github/llchen/apidoc/utils/MarkdownEntity.java
index fbf0d68..8b768bb 100644
--- a/src/main/java/io/github/llchen/apidoc/utils/MarkdownEntity.java
+++ b/src/main/java/com/github/llchen/apidoc/utils/MarkdownEntity.java
@@ -1,4 +1,4 @@
-package io.github.llchen.apidoc.utils;
+package com.github.llchen.apidoc.utils;
import java.util.HashMap;
import java.util.Map;
diff --git a/src/main/java/io/github/llchen/apidoc/utils/MarkdownUtil.java b/src/main/java/com/github/llchen/apidoc/utils/MarkdownUtil.java
similarity index 99%
rename from src/main/java/io/github/llchen/apidoc/utils/MarkdownUtil.java
rename to src/main/java/com/github/llchen/apidoc/utils/MarkdownUtil.java
index ec406a0..2f2627a 100644
--- a/src/main/java/io/github/llchen/apidoc/utils/MarkdownUtil.java
+++ b/src/main/java/com/github/llchen/apidoc/utils/MarkdownUtil.java
@@ -1,4 +1,4 @@
-package io.github.llchen.apidoc.utils;
+package com.github.llchen.apidoc.utils;
import com.vladsch.flexmark.ast.Node;
import com.vladsch.flexmark.ext.tables.TablesExtension;
diff --git a/src/main/java/com/github/llchen/apidoc/utils/Utils.java b/src/main/java/com/github/llchen/apidoc/utils/Utils.java
new file mode 100644
index 0000000..f46abf8
--- /dev/null
+++ b/src/main/java/com/github/llchen/apidoc/utils/Utils.java
@@ -0,0 +1,34 @@
+package com.github.llchen.apidoc.utils;
+
+import org.springframework.core.DefaultParameterNameDiscoverer;
+import org.springframework.core.ParameterNameDiscoverer;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author chenliangliang
+ * @date 2018/6/17
+ */
+public class Utils {
+
+ private static ParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer();
+
+ public static String requestMethod2Str(RequestMethod ... methods){
+ StringBuilder sb=new StringBuilder("[");
+ if (methods!=null&&methods.length>0) {
+ for (RequestMethod method : methods) {
+ sb.append(method.name()).append(",");
+ }
+ sb.deleteCharAt(sb.length()-1);
+ }else {
+ sb.append("GET,POST,PUT,DELETE");
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+
+ public static String[] getParameterNames(Method method){
+ return discoverer.getParameterNames(method);
+ }
+}
diff --git a/src/main/resources/META-INF/doc-comment.json b/src/main/resources/META-INF/doc-comment.json
new file mode 100644
index 0000000..88df7ac
--- /dev/null
+++ b/src/main/resources/META-INF/doc-comment.json
@@ -0,0 +1,287 @@
+{
+ "com.hfutonline.mly.modules.news.controller.ArticleTagController":{
+ "className":"com.hfutonline.mly.modules.news.controller.ArticleTagController",
+ "doc":" \n\n @author chenliangliang\n @date 2018-02-21 15:42:00\n",
+ "methods":[]
+ },
+ "com.hfutonline.mly.modules.news.controller.CatalogController":{
+ "className":"com.hfutonline.mly.modules.news.controller.CatalogController",
+ "doc":" 栏目\n\n @author chenliangliang\n @date 2018-02-21 15:42:00\n",
+ "methods":[{
+ "doc":" 信息\n",
+ "methodName":"info(id)"
+ },{
+ "doc":" 保存\n",
+ "methodName":"save(catalog)"
+ },{
+ "doc":" 删除\n",
+ "methodName":"delete(ids)"
+ },{
+ "methodName":"select()"
+ },{
+ "doc":" 修改\n",
+ "methodName":"update(catalog)"
+ },{
+ "doc":" 列表\n",
+ "methodName":"list(params)"
+ }]
+ },
+ "com.hfutonline.mly.modules.news.controller.TagController":{
+ "className":"com.hfutonline.mly.modules.news.controller.TagController",
+ "doc":" 标签管理\n\n @author chenliangliang\n @date 2018-02-21 15:41:59\n",
+ "methods":[{
+ "doc":" 信息\n",
+ "methodName":"info(id)"
+ },{
+ "doc":" 修改\n",
+ "methodName":"update(tag)"
+ },{
+ "doc":" 标签列表\n",
+ "methodName":"select()"
+ },{
+ "doc":" 删除\n",
+ "methodName":"delete(ids)"
+ },{
+ "doc":" 保存\n",
+ "methodName":"save(tag)"
+ },{
+ "doc":" 列表\n",
+ "methodName":"list(params)"
+ }]
+ },
+ "com.hfutonline.mly.modules.sys.controller.SysUserController":{
+ "className":"com.hfutonline.mly.modules.sys.controller.SysUserController",
+ "doc":" \n 系统用户 前端控制器\n
\n\n @author chenliangliang\n @since 2018-02-18\n",
+ "methods":[{
+ "doc":" 获取用户信息\n @param userId 用户id\n @return 用户详细信息\n",
+ "methodName":"info(userId)"
+ },{
+ "doc":" 获取登录的用户信息\n",
+ "methodName":"info()"
+ },{
+ "doc":" 修改登录用户密码\n",
+ "methodName":"password(password,newPassword)"
+ },{
+ "doc":" 保存用户\n",
+ "methodName":"save(user)"
+ },{
+ "doc":" 所有用户列表\n",
+ "methodName":"list(params)"
+ },{
+ "doc":" 修改用户\n",
+ "methodName":"update(user)"
+ },{
+ "doc":" 删除用户\n",
+ "methodName":"delete(userIds)"
+ }]
+ },
+ "com.hfutonline.mly.modules.sys.controller.SysLoginController":{
+ "className":"com.hfutonline.mly.modules.sys.controller.SysLoginController",
+ "doc":" 登录相关\n \n @author chenliangliang\n @date 2018/2/18\n",
+ "methods":[{
+ "doc":" 退出\n",
+ "methodName":"logout()"
+ },{
+ "methodName":"registerPage()"
+ },{
+ "methodName":"captcha(request,response)"
+ },{
+ "doc":" 登录\n",
+ "methodName":"login(username,password,captcha,session)"
+ },{
+ "methodName":"register(name,pw,model)"
+ }]
+ },
+ "com.hfutonline.mly.modules.web.controller.ServerController":{
+ "className":"com.hfutonline.mly.modules.web.controller.ServerController",
+ "doc":" 服务器表\n\n @author chenliangliang\n @date 2018-02-25 19:42:13\n",
+ "methods":[{
+ "doc":" 修改\n",
+ "methodName":"update(server)"
+ },{
+ "doc":" 信息\n",
+ "methodName":"info(id)"
+ },{
+ "doc":" 服务器列表\n",
+ "methodName":"select()"
+ },{
+ "doc":" 删除\n",
+ "methodName":"delete(ids)"
+ },{
+ "doc":" 保存\n",
+ "methodName":"save(server)"
+ },{
+ "doc":" 列表\n",
+ "methodName":"list(params)"
+ }]
+ },
+ "com.hfutonline.mly.modules.web.controller.AppController":{
+ "className":"com.hfutonline.mly.modules.web.controller.AppController",
+ "doc":" 应用表\n\n @author chenliangliang\n @date 2018-02-25 21:25:16\n",
+ "methods":[{
+ "doc":" 信息\n",
+ "methodName":"info(id)"
+ },{
+ "doc":" 修改\n",
+ "methodName":"update(app)"
+ },{
+ "methodName":"manageCatalog(app)"
+ },{
+ "doc":" 删除\n",
+ "methodName":"delete(ids)"
+ },{
+ "methodName":"manageCatalog(appId)"
+ },{
+ "doc":" 注册应用\n",
+ "methodName":"register(app)"
+ },{
+ "doc":" 列表\n",
+ "methodName":"list(params)"
+ }]
+ },
+ "com.hfutonline.mly.modules.news.controller.ArticleController":{
+ "className":"com.hfutonline.mly.modules.news.controller.ArticleController",
+ "doc":" 文章管理\n\n @author chenliangliang\n @date 2018-02-21 15:42:00\n",
+ "methods":[{
+ "methodName":"detail(id)"
+ },{
+ "doc":" 删除\n",
+ "methodName":"delete(ids)"
+ },{
+ "doc":" 修改\n",
+ "methodName":"update(article)"
+ },{
+ "doc":" 审核文章\n",
+ "methodName":"audit(id)"
+ },{
+ "doc":" 列表\n",
+ "methodName":"list(params)"
+ },{
+ "doc":" 保存\n",
+ "methodName":"save(article)"
+ }]
+ },
+ "com.hfutonline.mly.modules.sys.controller.SysUserRoleController":{
+ "className":"com.hfutonline.mly.modules.sys.controller.SysUserRoleController",
+ "doc":" \n 用户与角色对应关系 前端控制器\n
\n\n @author chenliangliang\n @since 2018-02-18\n",
+ "methods":[]
+ },
+ "com.hfutonline.mly.modules.sys.controller.SysPageController":{
+ "className":"com.hfutonline.mly.modules.sys.controller.SysPageController",
+ "doc":"系统页面视图\n\n @author chenliangliang\n @date 2018/2/18\n",
+ "methods":[{
+ "methodName":"main()"
+ },{
+ "methodName":"notFound()"
+ },{
+ "methodName":"index(model)"
+ },{
+ "methodName":"upload()"
+ },{
+ "methodName":"module(module,url)"
+ },{
+ "methodName":"login()"
+ }]
+ },
+ "com.hfutonline.mly.modules.web.controller.AppCatalogController":{
+ "className":"com.hfutonline.mly.modules.web.controller.AppCatalogController",
+ "doc":" \n\n @author chenliangliang\n @date 2018-02-25 21:25:16\n",
+ "methods":[]
+ },
+ "com.hfutonline.mly.modules.sys.controller.SysRoleMenuController":{
+ "className":"com.hfutonline.mly.modules.sys.controller.SysRoleMenuController",
+ "doc":" \n 角色与菜单对应关系 前端控制器\n
\n\n @author chenliangliang\n @since 2018-02-18\n",
+ "methods":[]
+ },
+ "com.hfutonline.mly.modules.news.controller.CatalogTagController":{
+ "className":"com.hfutonline.mly.modules.news.controller.CatalogTagController",
+ "doc":" \n\n @author chenliangliang\n @date 2018-02-25 21:20:50\n",
+ "methods":[{
+ "doc":" 保存\n",
+ "methodName":"save(catalogTag)"
+ },{
+ "doc":" 信息\n",
+ "methodName":"info(id)"
+ },{
+ "doc":" 删除\n",
+ "methodName":"delete(ids)"
+ },{
+ "doc":" 列表\n",
+ "methodName":"list(params)"
+ },{
+ "doc":" 修改\n",
+ "methodName":"update(catalogTag)"
+ }]
+ },
+ "com.hfutonline.mly.modules.sys.controller.SysRoleController":{
+ "className":"com.hfutonline.mly.modules.sys.controller.SysRoleController",
+ "doc":" \n 角色 前端控制器\n
\n\n @author chenliangliang\n @since 2018-02-18\n",
+ "methods":[{
+ "doc":" 保存角色\n",
+ "methodName":"save(role)"
+ },{
+ "doc":" 删除角色\n",
+ "methodName":"delete(roleIds)"
+ },{
+ "doc":" 修改角色\n",
+ "methodName":"update(role)"
+ },{
+ "doc":" 角色列表\n",
+ "methodName":"select()"
+ },{
+ "doc":" 角色列表\n",
+ "methodName":"list(params)"
+ },{
+ "doc":" 角色信息\n",
+ "methodName":"info(roleId)"
+ }]
+ },
+ "com.hfutonline.mly.modules.web.controller.AppServerController":{
+ "className":"com.hfutonline.mly.modules.web.controller.AppServerController",
+ "doc":" \n\n @author chenliangliang\n @date 2018-02-25 21:25:16\n",
+ "methods":[]
+ },
+ "com.hfutonline.mly.modules.api.controller.ArticleApi":{
+ "className":"com.hfutonline.mly.modules.api.controller.ArticleApi",
+ "doc":" @author chenliangliang\n @date 2018/2/28\n",
+ "methods":[{
+ "methodName":"getArticleTitle(catalogId,page,size)"
+ },{
+ "methodName":"getArticleDetail(id)"
+ }]
+ },
+ "com.hfutonline.mly.modules.sys.controller.SysLogController":{
+ "className":"com.hfutonline.mly.modules.sys.controller.SysLogController",
+ "doc":" \n 系统日志 前端控制器\n
\n\n @author chenliangliang\n @since 2018-02-18\n",
+ "methods":[{
+ "doc":" 列表\n",
+ "methodName":"list(params)"
+ }]
+ },
+ "com.hfutonline.mly.modules.sys.controller.SysMenuController":{
+ "className":"com.hfutonline.mly.modules.sys.controller.SysMenuController",
+ "doc":" \n 菜单管理 前端控制器\n
\n\n @author chenliangliang\n @since 2018-02-18\n",
+ "methods":[{
+ "doc":" 菜单信息\n",
+ "methodName":"info(menuId)"
+ },{
+ "doc":" 保存\n",
+ "methodName":"save(menu)"
+ },{
+ "doc":" 所有菜单列表\n",
+ "methodName":"list()"
+ },{
+ "doc":" 修改\n",
+ "methodName":"update(menu)"
+ },{
+ "doc":" 选择菜单(添加、修改菜单)\n",
+ "methodName":"select()"
+ },{
+ "doc":" 删除\n",
+ "methodName":"delete(menuId)"
+ },{
+ "doc":" 导航菜单\n @demoResponse {djjdjd}\n @return hdhdhd\n\n",
+ "methodName":"nav()"
+ }]
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/src/main/resources/META-INF/services/javax.annotation.processing.Processor
new file mode 100644
index 0000000..00bae2b
--- /dev/null
+++ b/src/main/resources/META-INF/services/javax.annotation.processing.Processor
@@ -0,0 +1 @@
+com.github.llchen.apidoc.process.DocCommentProcessor
\ No newline at end of file
diff --git a/src/main/resources/META-INF/spring.factories b/src/main/resources/META-INF/spring.factories
index 41e8b0e..7909149 100644
--- a/src/main/resources/META-INF/spring.factories
+++ b/src/main/resources/META-INF/spring.factories
@@ -1,3 +1,3 @@
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-io.github.llchen.apidoc.config.ApiDocAutoConfiguration
\ No newline at end of file
+com.github.llchen.apidoc.config.ApiDocAutoConfiguration
\ No newline at end of file