生成java文档表格工具

我们写的类属性注释有时候来自swagger,有时候来自于注释,有时候代码里不有,数据库表字段上才有。那么要写文档时怎么办?

于是写一个工具,从这三个地方生成统一的文档格式。一方面自己看着方便,别一方面如果要出详细设计文档也很方便。

主类:

package com.xx.mp;

import com.alibaba.excel.util.StringUtils;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xx.mp.indicator.entity.NetworkTaskDetail;
import io.swagger.annotations.ApiModelProperty;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.sql.*;
import java.util.*;

public class DocUtil {
    public static void main(String args[]) throws Exception{
        /**
         * 1.先看tableName标签
         * 2.看swagger标签
         * 3.反射原始属性名
         * 4. javadoc -encoding UTF-8 -charset UTF-8 -private -d javadoc TaskConfigDTO.java
         *              再用Jsoup解析
         */
        boolean readJavaDoc=true;
        Class cls= NetworkTaskDetail.class;


        //改类名
        Field md[]= cls.getDeclaredFields();
        List datas=new ArrayList<>();
        List<String> title= Arrays.asList("参数名","类型","说明");

        if(readJavaDoc){
            String path="/Users/chengzhong/code/xx/tj-monitor-platform/indicator/src/main/java/com/xx/mp/indicator/entity/javadoc/com/xx/mp/indicator/entity/NetworkTaskDetail.html";
            Map<String,String> colMap=JavaDocUtil.parseMap(path);
            for (Field m : md) {
                if (Modifier.isFinal(m.getModifiers())) {
                    continue;
                }
                String paramName = m.getName();
                String txt = colMap.get(paramName);
                String remark = txt == null ? paramName : txt;
                Boolean require = true;
                String type = m.getType().getSimpleName();
                //require ? "是" : "否",
                datas.add(Arrays.asList(paramName, type, remark));
            }
        }else {
            if (cls.isAnnotationPresent(TableName.class)) {
                String tableName = ((TableName) cls.getAnnotation(TableName.class)).value();
                Map<String, String> colMap = new MysqlMetaUtil().getTabProRemark(tableName);
                for (Field m : md) {
                    if (Modifier.isFinal(m.getModifiers())) {
                        continue;
                    }
                    String paramName = m.getName();
                    String txt = colMap.get(paramName);
                    String remark = txt == null ? paramName : txt;
                    Boolean require = true;
                    String type = m.getType().getSimpleName();
                    //require ? "是" : "否",
                    datas.add(Arrays.asList(paramName, type, remark));
                }
            } else {

                boolean haveSwagger = false;
                for (Field m : md) {
                    if (m.isAnnotationPresent(ApiModelProperty.class)) {
                        haveSwagger = true;
                        break;
                    }
                }


                for (Field m : md) {
                    if (Modifier.isFinal(m.getModifiers())) {
                        continue;
                    }
                    String paramName = m.getName();
                    String remark = m.getName();
                    Boolean require = true;
                    String type = m.getType().getSimpleName();

                    //如果有swagger
                    if (m.isAnnotationPresent(ApiModelProperty.class)) {
                        String aName = m.getAnnotation(ApiModelProperty.class).name();
                        if (!StringUtils.isBlank(aName)) {
                            paramName = aName;
                        }
                        remark = m.getAnnotation(ApiModelProperty.class).value();
                        require = m.getAnnotation(ApiModelProperty.class).required();
                        type = m.getType().getSimpleName();

                    }
                    //require ? "是" : "否",
                    datas.add(Arrays.asList(paramName, type, remark));
                }


            }
        }
        String html=createHtml(title,datas);
        System.out.println(html);


    }

    public static String createHtml(List<String> title,List<List<String>> datas){
        StringBuffer sb=new StringBuffer();
        sb.append("<html><head>");
        sb.append("<style type='text/css'>");
        sb.append("td,th{border:1px solid #000;padding:10px} table{border-collapse:collapse;}th{background-color:#dcdcdc}");
        sb.append("</style></head><body>");
        sb.append("<table style='border:1px solid #000' class=" xhe-border" class=" xhe-border"><tr>");
        for(String t:title){
            sb.append("<th>"+t+"</th>");
        }
        sb.append("</tr>");
        for(List<String> line:datas) {
            sb.append("<tr>");
            for(String grid:line) {
                sb.append("<td>"+grid+"</td>");
            }
            sb.append("</tr>");
        }
        sb.append("</table></body></html>");
        return sb.toString();

    }




}
class MysqlMetaUtil{
    final static String driver = "com.mysql.cj.jdbc.Driver";
    String dbUrl="jdbc:mysql://192.168.xx.xx:3306/";
    String dbName="xx";
    String dbUserName="root";
    String dbPasswd="xx";

    Connection conn=null;
    public MysqlMetaUtil() throws Exception{

        Class.forName(driver);
        String url = dbUrl + dbName + "?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai";
        conn = DriverManager.getConnection(url,dbUserName,dbPasswd);

    }
    public Map<String,String> getTabProRemark(String tabName) throws Exception{
        String sql="SELECT  table_name,column_name columnName,data_type dataType,column_comment columnComment " +
                "FROM information_schema.COLUMNS WHERE table_name='"+tabName+"' AND table_schema = '"+dbName+"'";
        DatabaseMetaData dbm=conn.getMetaData();
        Statement stm = conn.createStatement();
        ResultSet rs = stm.executeQuery(sql);
        Map<String,String> colVal=new HashMap<>();
        while(rs.next()){
            String name=rs.getString("columnName");
            String label=rs.getString("columnComment");
            colVal.put(convertCamelCase(name),label);

        }
        return colVal;

    }

    private static String convertCamelCase(String name) {
        String[] words=name.split("_");
        if(words.length==1) {
            return words[0];
        }
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<words.length;i++) {
            if(i==0) {
                sb.append(words[i]);
            }else {
                String first=String.valueOf(words[i].charAt(0)).toUpperCase();
                if(words[i].length()>1) {
                    first+=words[i].substring(1);
                }
                sb.append(first);
            }
        }
        return sb.toString();
    }
}




取生成的javadoc的html的注释的辅助类:

package com.xx.mp;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

public class JavaDocUtil {
    public static void main(String args[]) throws Exception{
        


    }

    public static Map<String,String> parseMap(String path) throws Exception{
        Document doc=Jsoup.parse(new File(path),"UTF-8");
        Element ele=doc.select(".memberSummary").get(0);
        Elements fele=ele.select(".colLast");
        Map<String,String> fieldMap=new HashMap<>();
        for(int i=0;i<fele.size();i++){
            String name=fele.get(i).select("code").text();
            String descb=fele.get(i).select(".block").text();
            //System.out.println(name+""+descb);
            fieldMap.put(name,descb);
        }
        return fieldMap;
    }





}


辅助类需要jsoup的pom依赖:

<dependency>
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.9.2</version>
</dependency>
几种执行的方法在源文件的注释里有。

文/程忠 浏览次数:0次   2023-03-09 19:57:44

相关阅读


评论:
点击刷新

↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑