Commit 5734b399 authored by 赵啸非's avatar 赵啸非

添加feign接口自动生成

parent 488bb754
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
"nprogress": "0.2.0", "nprogress": "0.2.0",
"quill": "1.3.7", "quill": "1.3.7",
"screenfull": "5.0.2", "screenfull": "5.0.2",
"showdown": "^2.1.0",
"sockjs-client": "^1.5.1", "sockjs-client": "^1.5.1",
"sortablejs": "1.10.2", "sortablejs": "1.10.2",
"stompjs": "^2.3.3", "stompjs": "^2.3.3",
......
...@@ -50,6 +50,8 @@ export default { ...@@ -50,6 +50,8 @@ export default {
columns: [ columns: [
{ type: "selection", width: 60 }, { type: "selection", width: 60 },
{ label: "应用名称", prop: "name" }, { label: "应用名称", prop: "name" },
{ label: "应用标识", prop: "code" },
{ label: "应用访问路径", prop: "path" },
{ label: "备注", prop: "remark" }, { label: "备注", prop: "remark" },
{ label: "创建用户名称", prop: "createUserName" }, { label: "创建用户名称", prop: "createUserName" },
{ {
......
...@@ -3,6 +3,10 @@ ...@@ -3,6 +3,10 @@
<el-form :model="form" :loading="loading" :rules="rules" size='small' style="width:100%" label-width='120px' ref="form"> <el-form :model="form" :loading="loading" :rules="rules" size='small' style="width:100%" label-width='120px' ref="form">
<el-row> <el-row>
<Field label="应用名称" :span="18" prop="name" v-model="form.name" placeholder="请输入应用名称"/> <Field label="应用名称" :span="18" prop="name" v-model="form.name" placeholder="请输入应用名称"/>
<Field label="应用标识" :span="18" prop="code" v-model="form.code" placeholder="微服务中标识名,如base-platform"/>
<Field label="应用请求路径" :span="18" prop="path" v-model="form.path" placeholder="微服务中访问路径,如/zwfw"/>
<Field label="备注" prop="remark" :span="18" type="textarea" v-model="form.remark" placeholder="请输入备注"/> <Field label="备注" prop="remark" :span="18" type="textarea" v-model="form.remark" placeholder="请输入备注"/>
</el-row> </el-row>
......
...@@ -220,6 +220,7 @@ export default { ...@@ -220,6 +220,7 @@ export default {
"genType", "genType",
"isGenExport", "isGenExport",
"isShowControl", "isShowControl",
"genFeign",
], // 需要把number转化为string的表单字段name数组 ], // 需要把number转化为string的表单字段name数组
}; };
}, },
...@@ -245,8 +246,6 @@ export default { ...@@ -245,8 +246,6 @@ export default {
console.log("info",this.info) console.log("info",this.info)
} }
this.tables = res.data.tables; this.tables = res.data.tables;
this.dict = Object.assign({}, this.dict, res.data.dict); this.dict = Object.assign({}, this.dict, res.data.dict);
this.loading = false; this.loading = false;
......
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item prop="genFeign"> <el-form-item prop="genFeign">
<span slot="label">是否生成Feign</span> <span slot="label">是否生成Feign</span>
<el-select v-model="info.genFeign"> <el-select v-model="info.genFeign">
<el-option label="是" value="1" /> <el-option label="是" value="1" />
<el-option label="否" value="0" /> <el-option label="否" value="0" />
...@@ -52,7 +51,7 @@ ...@@ -52,7 +51,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <!-- <el-col :span="12">
<el-form-item prop="feignAppName"> <el-form-item prop="feignAppName">
<span slot="label"> <span slot="label">
feign应用工程名 feign应用工程名
...@@ -65,9 +64,9 @@ ...@@ -65,9 +64,9 @@
</span> </span>
<el-input v-model="info.feignAppName" /> <el-input v-model="info.feignAppName" />
</el-form-item> </el-form-item>
</el-col> </el-col> -->
<el-col :span="12"> <!-- <el-col :span="12">
<el-form-item prop="genApi"> <el-form-item prop="genApi">
<span slot="label">是否生成对外api</span> <span slot="label">是否生成对外api</span>
<el-select v-model="info.genApi"> <el-select v-model="info.genApi">
...@@ -75,7 +74,7 @@ ...@@ -75,7 +74,7 @@
<el-option label="否" value="0" /> <el-option label="否" value="0" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col> -->
<el-col :span="12"> <el-col :span="12">
<el-form-item prop="isGenExport"> <el-form-item prop="isGenExport">
...@@ -87,7 +86,7 @@ ...@@ -87,7 +86,7 @@
</span> </span>
<el-select v-model="info.isGenExport"> <el-select v-model="info.isGenExport">
<el-option label="是" value="1" /> <el-option label="是" value="1" />
<el-option label="否" value="0" /> <el-option label="否" value="0" />
</el-select> </el-select>
......
...@@ -248,6 +248,7 @@ hljs.registerLanguage("xml", require("highlight.js/lib/languages/xml")); ...@@ -248,6 +248,7 @@ hljs.registerLanguage("xml", require("highlight.js/lib/languages/xml"));
hljs.registerLanguage("html", require("highlight.js/lib/languages/xml")); hljs.registerLanguage("html", require("highlight.js/lib/languages/xml"));
hljs.registerLanguage("vue", require("highlight.js/lib/languages/xml")); hljs.registerLanguage("vue", require("highlight.js/lib/languages/xml"));
hljs.registerLanguage("test", require("highlight.js/lib/languages/xml")); hljs.registerLanguage("test", require("highlight.js/lib/languages/xml"));
hljs.registerLanguage("md", require("highlight.js/lib/languages/xml"));
hljs.registerLanguage( hljs.registerLanguage(
"javascript", "javascript",
require("highlight.js/lib/languages/javascript") require("highlight.js/lib/languages/javascript")
......
...@@ -67,6 +67,12 @@ ...@@ -67,6 +67,12 @@
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.thoughtworks.qdox/qdox -->
<dependency>
<groupId>com.thoughtworks.qdox</groupId>
<artifactId>qdox</artifactId>
<version>2.0.1</version>
</dependency>
<dependency> <dependency>
......
...@@ -28,6 +28,10 @@ public class GentableEntityExt extends BaseEntityLong { ...@@ -28,6 +28,10 @@ public class GentableEntityExt extends BaseEntityLong {
private String requestMapping; private String requestMapping;
private String code;
private String path;
/** /**
* 表列信息 * 表列信息
*/ */
......
...@@ -27,6 +27,8 @@ import com.mortals.xhx.common.utils.FreeMarkerUtils; ...@@ -27,6 +27,8 @@ import com.mortals.xhx.common.utils.FreeMarkerUtils;
import com.mortals.xhx.common.utils.GenUtils; import com.mortals.xhx.common.utils.GenUtils;
import com.mortals.xhx.common.utils.ReadDoc; import com.mortals.xhx.common.utils.ReadDoc;
import com.mortals.xhx.common.utils.StringUtils; import com.mortals.xhx.common.utils.StringUtils;
import com.mortals.xhx.module.app.model.AppEntity;
import com.mortals.xhx.module.app.service.AppService;
import freemarker.template.Template; import freemarker.template.Template;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
...@@ -60,24 +62,12 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -60,24 +62,12 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
@Autowired @Autowired
private GentableColumnService gentableColumnService; private GentableColumnService gentableColumnService;
@Autowired
private AppService appService;
String headStr = "版本 | 创建时间 | 作者 | 备注信息\n" +
"---|---|---|---\n" +
"v1.0|" + DateUtils.getCurrStrDate() + "|zxfei| 接口文档\n\n" +
"## 数据类型\n" +
"类型名称|类型描述|参考样例\n" +
"---|---|---\n" +
"String |字符串|A、a、ab\n" +
"Integer|数字类型|1、12、-1\n" +
"Long|长整型数字|1、12、-1\n" +
"date|时间类型,单位纳秒数字|167988745573\n" +
"BigDecimal|小数类型|545.256\n" +
"object|对象类型|{\"name\":\"zhang3\"}\n" +
"arrays|数组类型|[{\"name\":\"zhang3\"},{\"name\":\"zhang2\"}]\n";
@Override @Override
public List<GentableEntity> selectDbTableList(GentableQuery query) { public List<GentableEntity> selectDbTableList(GentableQuery query) {
//query to dao
ParamDto paramDto = new ParamDto(); ParamDto paramDto = new ParamDto();
Map map = new HashMap(); Map map = new HashMap();
EntityUtil.entityToMap(query, map); EntityUtil.entityToMap(query, map);
...@@ -104,6 +94,7 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -104,6 +94,7 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
GenUtils.initTable(table, operName); GenUtils.initTable(table, operName);
table.setGenType(0); table.setGenType(0);
table.setIsGenExport(0); table.setIsGenExport(0);
table.setGenFeign(0);
table.setIsShowControl(2); table.setIsShowControl(2);
table.setGenPath("/"); table.setGenPath("/");
table.setTplCategory("crud"); table.setTplCategory("crud");
...@@ -159,7 +150,9 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -159,7 +150,9 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
setSubTable(gentableEntity); setSubTable(gentableEntity);
// 设置主键列信息 // 设置主键列信息
setPkColumn(gentableEntity); setPkColumn(gentableEntity);
String requestMapping = Arrays.stream(getBusinessNameExt(gentableEntity.getTableName()).split("\\.")).collect(Collectors.joining("/"));
gentableEntity.setRequestMapping(requestMapping);
buildAppInfo(gentableEntity);
//生成模板基础数据 //生成模板基础数据
Map data = FreeMarkerUtils.prepareSetFreeMarkerData(gentableEntity); Map data = FreeMarkerUtils.prepareSetFreeMarkerData(gentableEntity);
//输出合成模板 //输出合成模板
...@@ -168,16 +161,40 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -168,16 +161,40 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
if (temp.equals("enum.java.ftl")) { if (temp.equals("enum.java.ftl")) {
continue; continue;
} }
if (temp.equals("api.md.ftl")) { //如果开启feign生成模式,加载feign生成模板
if (gentableEntity.getGenFeign() == 0) {
if (temp.contains("feign.java.ftl") || temp.contains("pdu.java.ftl")) {
continue;
}
}
if (gentableEntity.getIsShowControl() == 2) {
if (temp.contains("webForm.java.ftl")) {
continue;
}
}
if (gentableEntity.getIsShowControl() == 0) {
if (temp.contains("webBody.java.ftl")) {
continue; continue;
} }
}
// if (temp.equals("api-two.md.ftl")) { if (temp.equals("menu.sql.ftl")||temp.equals("db.sql.ftl")||temp.equals("api.md.ftl")) {
// continue; try {
// } List<GentableEntity> tableList = new ArrayList<>();
// if (temp.equals("apidict.md.ftl")) { tableList.add(gentableEntity);
// continue; data.put("tableList", tableList);
// } //初始化freeMarkers
FreeMarkerUtils.initFreeMarker(genFreePath(temp));
// 渲染模板
StringWriter sw = new StringWriter();
Template template = FreeMarkerUtils.getTemplate(temp);
template.process(data, sw);
dataMap.put(temp, sw.toString());
} catch (Exception e) {
log.error("异常", e);
}
continue;
}
try { try {
//初始化freeMarkers //初始化freeMarkers
FreeMarkerUtils.initFreeMarker(genFreePath(temp)); FreeMarkerUtils.initFreeMarker(genFreePath(temp));
...@@ -216,10 +233,10 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -216,10 +233,10 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
Map data = new HashMap(); Map data = new HashMap();
data.put("tableList", tableList); data.put("tableList", tableList);
FreeMarkerUtils.initFreeMarker(genFreePath("menu.sql.ftl")); FreeMarkerUtils.initFreeMarker(genFreePath("menu.sql.ftl"));
zipTemplate("menu.sql.ftl","db/menu.sql",data,zip); zipTemplate("menu.sql.ftl", "db/menu.sql", data, zip);
zipTemplate("db.sql.ftl","db/db.sql",data,zip); zipTemplate("db.sql.ftl", "db/db.sql", data, zip);
FreeMarkerUtils.initFreeMarker(genFreePath("api.md.ftl")); FreeMarkerUtils.initFreeMarker(genFreePath("api.md.ftl"));
zipTemplate("api.md.ftl","doc/api.md",data,zip); zipTemplate("api.md.ftl", "doc/api.md", data, zip);
IOUtils.closeQuietly(zip); IOUtils.closeQuietly(zip);
return outputStream.toByteArray(); return outputStream.toByteArray();
...@@ -238,10 +255,10 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -238,10 +255,10 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
Map data = new HashMap(); Map data = new HashMap();
data.put("tableList", tableList); data.put("tableList", tableList);
FreeMarkerUtils.initFreeMarker(genFreePath("menu.sql.ftl")); FreeMarkerUtils.initFreeMarker(genFreePath("menu.sql.ftl"));
zipTemplate("menu.sql.ftl","db/menu.sql",data,zip); zipTemplate("menu.sql.ftl", "db/menu.sql", data, zip);
zipTemplate("db.sql.ftl","db/db.sql",data,zip); zipTemplate("db.sql.ftl", "db/db.sql", data, zip);
FreeMarkerUtils.initFreeMarker(genFreePath("api.md.ftl")); FreeMarkerUtils.initFreeMarker(genFreePath("api.md.ftl"));
zipTemplate("api.md.ftl","doc/api.md",data,zip); zipTemplate("api.md.ftl", "doc/api.md", data, zip);
IOUtils.closeQuietly(zip); IOUtils.closeQuietly(zip);
return outputStream.toByteArray(); return outputStream.toByteArray();
} }
...@@ -333,6 +350,7 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -333,6 +350,7 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
GenUtils.initTable(table, operName); GenUtils.initTable(table, operName);
table.setAppId(appId); table.setAppId(appId);
table.setGenType(0); table.setGenType(0);
table.setGenFeign(0);
table.setIsGenExport(0); table.setIsGenExport(0);
table.setIsShowControl(2); table.setIsShowControl(2);
table.setGenPath("/"); table.setGenPath("/");
...@@ -417,6 +435,8 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -417,6 +435,8 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
String requestMapping = Arrays.stream(getBusinessNameExt(gentableEntity.getTableName()).split("\\.")).collect(Collectors.joining("/")); String requestMapping = Arrays.stream(getBusinessNameExt(gentableEntity.getTableName()).split("\\.")).collect(Collectors.joining("/"));
gentableEntity.setRequestMapping(requestMapping); gentableEntity.setRequestMapping(requestMapping);
buildAppInfo(gentableEntity);
//生成模板基础数据 //生成模板基础数据
Map data = FreeMarkerUtils.prepareSetFreeMarkerData(gentableEntity); Map data = FreeMarkerUtils.prepareSetFreeMarkerData(gentableEntity);
...@@ -465,11 +485,17 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -465,11 +485,17 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
if (temp.contains("web.java.ftl") || temp.contains("webForm.java.ftl")) { if (temp.contains("web.java.ftl") || temp.contains("webForm.java.ftl")) {
continue; continue;
} }
}else{ } else {
if (temp.contains("webBody.java.ftl")) { if (temp.contains("webBody.java.ftl")) {
continue; continue;
} }
} }
//如果开启feign生成模式,加载feign生成模板
if (gentableEntity.getGenFeign() == 0) {
if (temp.contains("feign.java.ftl") || temp.contains("pdu.java.ftl")) {
continue;
}
}
if (temp.equals("menu.sql.ftl")) { if (temp.equals("menu.sql.ftl")) {
continue; continue;
...@@ -499,6 +525,12 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -499,6 +525,12 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
return gentableEntity; return gentableEntity;
} }
private void buildAppInfo(GentableEntity gentableEntity) {
AppEntity appEntity = appService.get(gentableEntity.getAppId());
gentableEntity.setCode(appEntity.getCode());
gentableEntity.setPath(appEntity.getPath());
}
/** /**
* 生成文档 * 生成文档
*/ */
...@@ -510,6 +542,7 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -510,6 +542,7 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
for (Long tableId : tableIds) { for (Long tableId : tableIds) {
GentableEntity gentableEntity = this.get(tableId); GentableEntity gentableEntity = this.get(tableId);
if (!ObjectUtils.isEmpty(gentableEntity)) { if (!ObjectUtils.isEmpty(gentableEntity)) {
buildAppInfo(gentableEntity);
List<GentableColumnEntity> columnEntities = this.gentableColumnService.find(new GentableColumnQuery().tableId(gentableEntity.getId())); List<GentableColumnEntity> columnEntities = this.gentableColumnService.find(new GentableColumnQuery().tableId(gentableEntity.getId()));
gentableEntity.setColumns(columnEntities); gentableEntity.setColumns(columnEntities);
// 设置主子表信息 // 设置主子表信息
...@@ -542,22 +575,7 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge ...@@ -542,22 +575,7 @@ public class GentableServiceImpl extends AbstractCRUDServiceImpl<GentableDao, Ge
} catch (IOException e) { } catch (IOException e) {
log.error("ioEx:", e); log.error("ioEx:", e);
} }
} }
//通过模板生成不同的业务类
/* String temp = "db.doc.ftl";
try {
FreeMarkerUtils.initFreeMarker(genFreePath(temp));
StringWriter sw = new StringWriter();
Template template = FreeMarkerUtils.getTemplate(temp);
template.process(data, sw);
return sw.toString().getBytes(Constant.UTF8);
} catch (Exception e) {
log.error("渲染模板失败:" , e);
return null;
}*/
} }
/** /**
......
...@@ -25,32 +25,25 @@ import java.util.stream.Collectors; ...@@ -25,32 +25,25 @@ import java.util.stream.Collectors;
import static com.mortals.xhx.common.utils.GenUtils.getBusinessNameExt; import static com.mortals.xhx.common.utils.GenUtils.getBusinessNameExt;
public class FreeMarkerUtils { public class FreeMarkerUtils {
/** /**
* 项目空间路径 * 项目空间路径
*/ */
private static final String PROJECT_PATH = "main/java"; private static final String PROJECT_PATH = "main/java";
private static final String TEST_PATH = "test/java/com/mortals/httpclient"; private static final String TEST_PATH = "test/java/com/mortals/httpclient";
private static final String FEIGN_PATH = "feign/main/java/com/mortals/xhx/feign";
private static final String PDU_PATH = "feign/main/java/com/mortals/xhx/common/pdu";
/** /**
* mybatis空间路径 * mybatis空间路径
*/ */
private static final String MYBATIS_PATH = "main/resources/sqlmap"; private static final String MYBATIS_PATH = "main/resources/sqlmap";
/**
* 默认上级菜单,系统工具
*/
private static final String DEFAULT_PARENT_MENU_ID = "3";
public static Configuration cfg = null; public static Configuration cfg = null;
public static StringBuilder dbSql = new StringBuilder();
public static StringBuilder menuSql = new StringBuilder();
public static StringBuilder paramsSql = new StringBuilder();
public static StringBuilder apimd = new StringBuilder(); public static StringBuilder apimd = new StringBuilder();
public static StringBuilder apitwomd = new StringBuilder(); public static StringBuilder apitwomd = new StringBuilder();
public static StringBuilder apidict = new StringBuilder();
/** /**
* 初始化freeMaker方法 * 初始化freeMaker方法
...@@ -100,15 +93,14 @@ public class FreeMarkerUtils { ...@@ -100,15 +93,14 @@ public class FreeMarkerUtils {
templates.add("dao.java.ftl"); templates.add("dao.java.ftl");
templates.add("daoImpl.java.ftl"); templates.add("daoImpl.java.ftl");
templates.add("web.java.ftl"); templates.add("web.java.ftl");
templates.add("feign.java.ftl");
templates.add("pdu.java.ftl");
templates.add("webBody.java.ftl"); templates.add("webBody.java.ftl");
templates.add("webForm.java.ftl"); templates.add("webForm.java.ftl");
templates.add("sqlMap.xml.ftl"); templates.add("sqlMap.xml.ftl");
templates.add("db.sql.ftl"); templates.add("db.sql.ftl");
templates.add("menu.sql.ftl"); templates.add("menu.sql.ftl");
// templates.add("params.sql.ftl");
templates.add("api.md.ftl"); templates.add("api.md.ftl");
// templates.add("api-two.md.ftl");
// templates.add("apidict.md.ftl");
templates.add("httpclient.test.ftl"); templates.add("httpclient.test.ftl");
if (GenConstants.TPL_CRUD.equals(tplCategory)) { if (GenConstants.TPL_CRUD.equals(tplCategory)) {
templates.add("service.java.ftl"); templates.add("service.java.ftl");
...@@ -122,7 +114,7 @@ public class FreeMarkerUtils { ...@@ -122,7 +114,7 @@ public class FreeMarkerUtils {
templates.add("serviceImpl-tree.java.ftl"); templates.add("serviceImpl-tree.java.ftl");
templates.add("VueTreeDialogShow.vue.ftl"); templates.add("VueTreeDialogShow.vue.ftl");
templates.add("webVueTreeList.vue.ftl"); templates.add("webVueTreeList.vue.ftl");
} else if (GenConstants.TPL_SUB.equals(tplCategory)||GenConstants.TPL_SUB_ONE.equals(tplCategory)) { } else if (GenConstants.TPL_SUB.equals(tplCategory) || GenConstants.TPL_SUB_ONE.equals(tplCategory)) {
templates.add("service.java.ftl"); templates.add("service.java.ftl");
templates.add("serviceImpl.java.ftl"); templates.add("serviceImpl.java.ftl");
templates.add("webVueList.vue.ftl"); templates.add("webVueList.vue.ftl");
...@@ -190,6 +182,10 @@ public class FreeMarkerUtils { ...@@ -190,6 +182,10 @@ public class FreeMarkerUtils {
data.put("importList", getImportList(genTable)); data.put("importList", getImportList(genTable));
data.put("columns", genTable.getColumns()); data.put("columns", genTable.getColumns());
data.put("table", genTable); data.put("table", genTable);
data.put("code", genTable.getCode());
data.put("path", genTable.getPath());
//com.mortals.xhx.feign.area
data.put("packageFeignName", "com.mortals.xhx.feign."+businessName);
String RequestMapping = Arrays.stream(getBusinessNameExt(genTable.getTableName()).split("\\.")).collect(Collectors.joining("/")); String RequestMapping = Arrays.stream(getBusinessNameExt(genTable.getTableName()).split("\\.")).collect(Collectors.joining("/"));
data.put("RequestMapping", RequestMapping); data.put("RequestMapping", RequestMapping);
...@@ -224,7 +220,7 @@ public class FreeMarkerUtils { ...@@ -224,7 +220,7 @@ public class FreeMarkerUtils {
* *
* @return 模板列表 * @return 模板列表
*/ */
public static Map prepareSetFreeMarkerDataByEnum(List<Map<String,String>> enums, String enumName, String enumClassName,String javaType) { public static Map prepareSetFreeMarkerDataByEnum(List<Map<String, String>> enums, String enumName, String enumClassName, String javaType) {
Map data = new HashMap(); Map data = new HashMap();
data.put("enums", enums); data.put("enums", enums);
data.put("EnumName", enumName); data.put("EnumName", enumName);
...@@ -405,13 +401,15 @@ public class FreeMarkerUtils { ...@@ -405,13 +401,15 @@ public class FreeMarkerUtils {
String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/") + "/" + moduleName; String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/") + "/" + moduleName;
String mybatisPath = MYBATIS_PATH + "/" + moduleName; String mybatisPath = MYBATIS_PATH + "/" + moduleName;
String feignPath = FEIGN_PATH + "/" + businessName;
String pduPath = PDU_PATH + "/" + businessName;
String vuePath = "vue"; String vuePath = "vue";
String dbPath = "db"; String dbPath = "db";
//实体类输出路径 //实体类输出路径
if (template.contains("entity.java.ftl")) { if (template.contains("entity.java.ftl")) {
fileName = StringUtils.format("{}/{}/model/{}Entity.java", javaPath, businessName, className); fileName = StringUtils.format("{}/{}/model/{}Entity.java", javaPath, businessName, className);
}else if (template.contains("entity-tree.java.ftl")) { } else if (template.contains("entity-tree.java.ftl")) {
fileName = StringUtils.format("{}/{}/model/{}TreeSelect.java", javaPath, businessName, className); fileName = StringUtils.format("{}/{}/model/{}TreeSelect.java", javaPath, businessName, className);
} else if (template.contains("vo.java.ftl")) { } else if (template.contains("vo.java.ftl")) {
fileName = StringUtils.format("{}/{}/model/vo/{}Vo.java", javaPath, businessName, className); fileName = StringUtils.format("{}/{}/model/vo/{}Vo.java", javaPath, businessName, className);
...@@ -429,14 +427,11 @@ public class FreeMarkerUtils { ...@@ -429,14 +427,11 @@ public class FreeMarkerUtils {
fileName = StringUtils.format("{}/{}/service/impl/{}ServiceImpl.java", javaPath, businessName, className); fileName = StringUtils.format("{}/{}/service/impl/{}ServiceImpl.java", javaPath, businessName, className);
} else if (template.contains("serviceImpl-tree.java.ftl")) { } else if (template.contains("serviceImpl-tree.java.ftl")) {
fileName = StringUtils.format("{}/{}/service/impl/{}ServiceImpl.java", javaPath, businessName, className); fileName = StringUtils.format("{}/{}/service/impl/{}ServiceImpl.java", javaPath, businessName, className);
} } else if (template.contains("web.java.ftl")) {
else if (template.contains("web.java.ftl")) {
fileName = StringUtils.format("{}/{}/web/{}Controller.java", javaPath, businessName, className); fileName = StringUtils.format("{}/{}/web/{}Controller.java", javaPath, businessName, className);
} } else if (template.contains("webBody.java.ftl")) {
else if (template.contains("webBody.java.ftl")) {
fileName = StringUtils.format("{}/{}/web/{}Controller.java", javaPath, businessName, className); fileName = StringUtils.format("{}/{}/web/{}Controller.java", javaPath, businessName, className);
} } else if (template.contains("webForm.java.ftl")) {
else if (template.contains("webForm.java.ftl")) {
fileName = StringUtils.format("{}/{}/web/{}Form.java", javaPath, businessName, className); fileName = StringUtils.format("{}/{}/web/{}Form.java", javaPath, businessName, className);
} else if (template.contains("sqlMap.xml.ftl")) { } else if (template.contains("sqlMap.xml.ftl")) {
fileName = StringUtils.format("{}/{}/{}Mapper.xml", mybatisPath, businessName, className); fileName = StringUtils.format("{}/{}/{}Mapper.xml", mybatisPath, businessName, className);
...@@ -472,14 +467,17 @@ public class FreeMarkerUtils { ...@@ -472,14 +467,17 @@ public class FreeMarkerUtils {
fileName = StringUtils.format("doc/alldoc.docx"); fileName = StringUtils.format("doc/alldoc.docx");
} else if (template.contains("api.doc.ftl")) { } else if (template.contains("api.doc.ftl")) {
fileName = StringUtils.format("doc/api.md"); fileName = StringUtils.format("doc/api.md");
}else if (template.contains("httpclient.test.ftl")) { } else if (template.contains("httpclient.test.ftl")) {
fileName = StringUtils.format("{}/{}/{}Controller.http", TEST_PATH, businessName, className); fileName = StringUtils.format("{}/{}/{}Controller.http", TEST_PATH, businessName, className);
} else if (template.contains("feign.java.ftl")) {
fileName = StringUtils.format("{}/I{}Feign.java", feignPath, className);
} else if (template.contains("pdu.java.ftl")) {
fileName = StringUtils.format("{}/{}Pdu.java", pduPath, className);
} }
return fileName; return fileName;
} }
/** /**
* 获取枚举文件名 * 获取枚举文件名
*/ */
......
package com.mortals.xhx.module.app.model; package com.mortals.xhx.module.app.model;
import java.util.List; import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel; import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong; import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.app.model.vo.AppVo; import com.mortals.xhx.module.app.model.vo.AppVo;
/** /**
* 应用信息实体对象 * 应用信息实体对象
* *
* @author zxfei * @author zxfei
* @date 2021-11-12 * @date 2022-06-24
*/ */
public class AppEntity extends AppVo { public class AppEntity extends AppVo {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
...@@ -18,6 +20,14 @@ public class AppEntity extends AppVo { ...@@ -18,6 +20,14 @@ public class AppEntity extends AppVo {
* 应用名称 * 应用名称
*/ */
private String name; private String name;
/**
* 编码标识
*/
private String code;
/**
* 服务访问相对路径,如/portal
*/
private String path;
/** /**
* 备注 * 备注
*/ */
...@@ -44,6 +54,34 @@ public class AppEntity extends AppVo { ...@@ -44,6 +54,34 @@ public class AppEntity extends AppVo {
public void setName(String name){ public void setName(String name){
this.name = name; this.name = name;
} }
/**
* 获取 编码标识
* @return String
*/
public String getCode(){
return code;
}
/**
* 设置 编码标识
* @param code
*/
public void setCode(String code){
this.code = code;
}
/**
* 获取 服务访问相对路径,如/portal
* @return String
*/
public String getPath(){
return path;
}
/**
* 设置 服务访问相对路径,如/portal
* @param path
*/
public void setPath(String path){
this.path = path;
}
/** /**
* 获取 备注 * 获取 备注
* @return String * @return String
...@@ -95,14 +133,23 @@ public class AppEntity extends AppVo { ...@@ -95,14 +133,23 @@ public class AppEntity extends AppVo {
public String toString(){ public String toString(){
StringBuilder sb = new StringBuilder(""); StringBuilder sb = new StringBuilder("");
sb.append(",name:").append(getName()); sb.append(",name:").append(getName());
sb.append(",code:").append(getCode());
sb.append(",path:").append(getPath());
sb.append(",remark:").append(getRemark()); sb.append(",remark:").append(getRemark());
sb.append(",createUserName:").append(getCreateUserName()); sb.append(",createUserName:").append(getCreateUserName());
return sb.toString(); return sb.toString();
} }
public void initAttrValue(){ public void initAttrValue(){
this.name = null; this.name = null;
this.code = null;
this.path = null;
this.remark = null; this.remark = null;
this.createUserName = null; this.createUserName = null;
} }
} }
\ No newline at end of file
...@@ -3,11 +3,11 @@ package com.mortals.xhx.module.app.model; ...@@ -3,11 +3,11 @@ package com.mortals.xhx.module.app.model;
import java.util.List; import java.util.List;
import com.mortals.xhx.module.app.model.AppEntity; import com.mortals.xhx.module.app.model.AppEntity;
/** /**
* 应用信息查询对象 * 应用信息查询对象
* *
* @author zxfei * @author zxfei
* @date 2021-11-12 * @date 2022-06-24
*/ */
public class AppQuery extends AppEntity { public class AppQuery extends AppEntity {
/** 开始 ID,主键,自增长 */ /** 开始 ID,主键,自增长 */
private Long idStart; private Long idStart;
...@@ -24,6 +24,12 @@ public class AppQuery extends AppEntity { ...@@ -24,6 +24,12 @@ public class AppQuery extends AppEntity {
/** 应用名称 */ /** 应用名称 */
private List<String> nameList; private List<String> nameList;
/** 编码标识 */
private List<String> codeList;
/** 服务访问相对路径,如/portal */
private List<String> pathList;
/** 备注 */ /** 备注 */
private List<String> remarkList; private List<String> remarkList;
...@@ -135,6 +141,36 @@ public class AppQuery extends AppEntity { ...@@ -135,6 +141,36 @@ public class AppQuery extends AppEntity {
public void setNameList(List<String> nameList){ public void setNameList(List<String> nameList){
this.nameList = nameList; this.nameList = nameList;
} }
/**
* 获取 编码标识
* @return codeList
*/
public List<String> getCodeList(){
return this.codeList;
}
/**
* 设置 编码标识
* @param codeList
*/
public void setCodeList(List<String> codeList){
this.codeList = codeList;
}
/**
* 获取 服务访问相对路径,如/portal
* @return pathList
*/
public List<String> getPathList(){
return this.pathList;
}
/**
* 设置 服务访问相对路径,如/portal
* @param pathList
*/
public void setPathList(List<String> pathList){
this.pathList = pathList;
}
/** /**
* 获取 备注 * 获取 备注
* @return remarkList * @return remarkList
...@@ -326,6 +362,44 @@ public class AppQuery extends AppEntity { ...@@ -326,6 +362,44 @@ public class AppQuery extends AppEntity {
} }
/**
* 设置 编码标识
* @param code
*/
public AppQuery code(String code){
setCode(code);
return this;
}
/**
* 设置 编码标识
* @param codeList
*/
public AppQuery codeList(List<String> codeList){
this.codeList = codeList;
return this;
}
/**
* 设置 服务访问相对路径,如/portal
* @param path
*/
public AppQuery path(String path){
setPath(path);
return this;
}
/**
* 设置 服务访问相对路径,如/portal
* @param pathList
*/
public AppQuery pathList(List<String> pathList){
this.pathList = pathList;
return this;
}
/** /**
* 设置 备注 * 设置 备注
* @param remark * @param remark
......
...@@ -55,3 +55,38 @@ cookie: ...@@ -55,3 +55,38 @@ cookie:
port: 111 port: 111
upload: upload:
path: @profiles.filepath@ path: @profiles.filepath@
# Swagger配置
swagger:
# 是否开启swagger
enabled: true
# 请求前缀
pathMapping:
# 标题
title: '标题'
# 描述
description: '描述'
# 版本
version: '版本号: 1.0'
# 作者信息
contact:
name: zxfei
email: 8153694@qq.com
url: http://www.baidu.com
groups:
- name: 1.产品模块
basePackage: com.mortals.xhx.module.product
knife4j:
# 是否开启Knife4j增强模式
enable: true
# 开启Swagger的Basic认证功能,默认是false
# 前端Ui的个性化配置属性
setting:
# 默认语言
language: zh-CN
# 是否显示Footer
enableFooter: false
# 是否开启动态参数调试功能
enableDynamicParameter: true
# 是否在每个Debug调试栏后显示刷新变量按钮
enableReloadCacheParameter: true
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd"> "mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.app.dao.ibatis.AppDaoImpl"> <mapper namespace="com.mortals.xhx.module.app.dao.ibatis.AppDaoImpl">
<!-- 字段和属性映射 --> <!-- 字段和属性映射 -->
<resultMap type="AppEntity" id="AppEntity-Map"> <resultMap type="AppEntity" id="AppEntity-Map">
<id property="id" column="id" /> <id property="id" column="id" />
<result property="name" column="name" /> <result property="name" column="name" />
<result property="code" column="code" />
<result property="path" column="path" />
<result property="remark" column="remark" /> <result property="remark" column="remark" />
<result property="createTime" column="createTime" /> <result property="createTime" column="createTime" />
<result property="createUserId" column="createUserId" /> <result property="createUserId" column="createUserId" />
...@@ -19,40 +21,46 @@ ...@@ -19,40 +21,46 @@
<sql id="_columns"> <sql id="_columns">
<trim suffixOverrides="," suffix=""> <trim suffixOverrides="," suffix="">
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('id') or colPickMode == 1 and data.containsKey('id')))"> <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('id') or colPickMode == 1 and data.containsKey('id')))">
a.id as id, a.id,
</if> </if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('name') or colPickMode == 1 and data.containsKey('name')))"> <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('name') or colPickMode == 1 and data.containsKey('name')))">
a.name as name, a.name,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('code') or colPickMode == 1 and data.containsKey('code')))">
a.code,
</if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('path') or colPickMode == 1 and data.containsKey('path')))">
a.path,
</if> </if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('remark') or colPickMode == 1 and data.containsKey('remark')))"> <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('remark') or colPickMode == 1 and data.containsKey('remark')))">
a.remark as remark, a.remark,
</if> </if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('createTime') or colPickMode == 1 and data.containsKey('createTime')))"> <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('createTime') or colPickMode == 1 and data.containsKey('createTime')))">
a.createTime as createTime, a.createTime,
</if> </if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('createUserId') or colPickMode == 1 and data.containsKey('createUserId')))"> <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('createUserId') or colPickMode == 1 and data.containsKey('createUserId')))">
a.createUserId as createUserId, a.createUserId,
</if> </if>
<if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('createUserName') or colPickMode == 1 and data.containsKey('createUserName')))"> <if test="(data == null) or (data != null and ( colPickMode == 0 and !data.containsKey('createUserName') or colPickMode == 1 and data.containsKey('createUserName')))">
a.createUserName as createUserName, a.createUserName,
</if> </if>
</trim> </trim>
</sql> </sql>
<!-- 新增 区分主键自增加还是业务插入 --> <!-- 新增 区分主键自增加还是业务插入 -->
<insert id="insert" parameterType="AppEntity" useGeneratedKeys="true" keyProperty="id"> <insert id="insert" parameterType="AppEntity" useGeneratedKeys="true" keyProperty="id">
insert into mortals_xhx_app insert into mortals_xhx_app
(name,remark,createTime,createUserId,createUserName) (name,code,path,remark,createTime,createUserId,createUserName)
VALUES VALUES
(#{name},#{remark},#{createTime},#{createUserId},#{createUserName}) (#{name},#{code},#{path},#{remark},#{createTime},#{createUserId},#{createUserName})
</insert> </insert>
<!-- 批量新增 --> <!-- 批量新增 -->
<insert id="insertBatch" parameterType="paramDto"> <insert id="insertBatch" parameterType="paramDto">
insert into mortals_xhx_app insert into mortals_xhx_app
(name,remark,createTime,createUserId,createUserName) (name,code,path,remark,createTime,createUserId,createUserName)
VALUES VALUES
<foreach collection="data.dataList" item="item" index="index" separator="," > <foreach collection="data.dataList" item="item" index="index" separator="," >
(#{item.name},#{item.remark},#{item.createTime},#{item.createUserId},#{item.createUserName}) (#{item.name},#{item.code},#{item.path},#{item.remark},#{item.createTime},#{item.createUserId},#{item.createUserName})
</foreach> </foreach>
</insert> </insert>
...@@ -65,6 +73,12 @@ ...@@ -65,6 +73,12 @@
<if test="(colPickMode==0 and data.containsKey('name')) or (colPickMode==1 and !data.containsKey('name'))"> <if test="(colPickMode==0 and data.containsKey('name')) or (colPickMode==1 and !data.containsKey('name'))">
a.name=#{data.name}, a.name=#{data.name},
</if> </if>
<if test="(colPickMode==0 and data.containsKey('code')) or (colPickMode==1 and !data.containsKey('code'))">
a.code=#{data.code},
</if>
<if test="(colPickMode==0 and data.containsKey('path')) or (colPickMode==1 and !data.containsKey('path'))">
a.path=#{data.path},
</if>
<if test="(colPickMode==0 and data.containsKey('remark')) or (colPickMode==1 and !data.containsKey('remark'))"> <if test="(colPickMode==0 and data.containsKey('remark')) or (colPickMode==1 and !data.containsKey('remark'))">
a.remark=#{data.remark}, a.remark=#{data.remark},
</if> </if>
...@@ -99,6 +113,20 @@ ...@@ -99,6 +113,20 @@
</if> </if>
</foreach> </foreach>
</trim> </trim>
<trim prefix="code=(case" suffix="ELSE code end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('code')) or (colPickMode==1 and !item.containsKey('code'))">
when a.id=#{item.id} then #{item.code}
</if>
</foreach>
</trim>
<trim prefix="path=(case" suffix="ELSE path end),">
<foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('path')) or (colPickMode==1 and !item.containsKey('path'))">
when a.id=#{item.id} then #{item.path}
</if>
</foreach>
</trim>
<trim prefix="remark=(case" suffix="ELSE remark end),"> <trim prefix="remark=(case" suffix="ELSE remark end),">
<foreach collection="data.dataList" item="item" index="index" separator="" > <foreach collection="data.dataList" item="item" index="index" separator="" >
<if test="(colPickMode==0 and item.containsKey('remark')) or (colPickMode==1 and !item.containsKey('remark'))"> <if test="(colPickMode==0 and item.containsKey('remark')) or (colPickMode==1 and !item.containsKey('remark'))">
...@@ -178,6 +206,8 @@ ...@@ -178,6 +206,8 @@
<include refid="_orderCols_"/> <include refid="_orderCols_"/>
</select> </select>
<!-- 获取 --> <!-- 获取 -->
<select id="getListCount" parameterType="paramDto" resultType="int"> <select id="getListCount" parameterType="paramDto" resultType="int">
select count(1) select count(1)
...@@ -268,6 +298,36 @@ ...@@ -268,6 +298,36 @@
</foreach> </foreach>
</if> </if>
<if test="conditionParamRef.containsKey('code')">
<if test="conditionParamRef.code != null and conditionParamRef.code != ''">
${_conditionType_} a.code like #{${_conditionParam_}.code}
</if>
<if test="conditionParamRef.code == null">
${_conditionType_} a.code is null
</if>
</if>
<if test="conditionParamRef.containsKey('codeList')">
${_conditionType_} a.code in
<foreach collection="conditionParamRef.codeList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('path')">
<if test="conditionParamRef.path != null and conditionParamRef.path != ''">
${_conditionType_} a.path like #{${_conditionParam_}.path}
</if>
<if test="conditionParamRef.path == null">
${_conditionType_} a.path is null
</if>
</if>
<if test="conditionParamRef.containsKey('pathList')">
${_conditionType_} a.path in
<foreach collection="conditionParamRef.pathList" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="conditionParamRef.containsKey('remark')"> <if test="conditionParamRef.containsKey('remark')">
<if test="conditionParamRef.remark != null and conditionParamRef.remark != ''"> <if test="conditionParamRef.remark != null and conditionParamRef.remark != ''">
${_conditionType_} a.remark like #{${_conditionParam_}.remark} ${_conditionType_} a.remark like #{${_conditionParam_}.remark}
...@@ -356,6 +416,16 @@ ...@@ -356,6 +416,16 @@
<if test='orderCol.name != null and "DESC".equalsIgnoreCase(orderCol.name)'>DESC</if> <if test='orderCol.name != null and "DESC".equalsIgnoreCase(orderCol.name)'>DESC</if>
, ,
</if> </if>
<if test="orderCol.containsKey('code')">
a.code
<if test='orderCol.code != null and "DESC".equalsIgnoreCase(orderCol.code)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('path')">
a.path
<if test='orderCol.path != null and "DESC".equalsIgnoreCase(orderCol.path)'>DESC</if>
,
</if>
<if test="orderCol.containsKey('remark')"> <if test="orderCol.containsKey('remark')">
a.remark a.remark
<if test='orderCol.remark != null and "DESC".equalsIgnoreCase(orderCol.remark)'>DESC</if> <if test='orderCol.remark != null and "DESC".equalsIgnoreCase(orderCol.remark)'>DESC</if>
......
Version | Update Time | Status | Author | Description
---|---|---|---|---
v2021-11-05 16:10:28|2021-11-05 16:10:28|auto|@finegirl|Created by smart-doc
类型名称|类型描述|参考样例
---|---|---
String |字符串|A、a、ab
Integer|数字类型|1、12、-1
Long|长整型数字|1、12、-1
date|时间类型,单位纳秒数字|167988745573
BigDecimal|小数类型|545.256
object|对象类型|{"name":"zhang3"}
arrays|数组类型|[{"name":"zhang3"},{"name":"zhang2"}]
## 错误码列表
Error code |Description
---|---
200|ok
400|Bad Request
401|Unauthorized
403|Forbidden
404|Not Found
415|Unsupported Media Type
500|Internal Server Error
502|Bad Gateway
503|Service Unavailable
This diff is collapsed.
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="smart-doc"><title>API Reference</title><link rel="stylesheet" href="https://fonts.googleapis.cnpmjs.org/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"><link rel="stylesheet" href="AllInOne.css?v=1636099828588"/><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/highlight.js/10.3.2/styles/null.min.css"><style>.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}.hljs{padding:0}</style><script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/10.3.2/highlight.min.js"></script><script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script></head><body class="book toc2 toc-left"><div id="header"><div id="toc" class="toc2"><div id="book-search-input"><input id="search" type="text" placeholder="Type to search"></div><div id="toctitle"><span>API Reference</span></div><ul id="accordion" class="sectlevel1"><li><a href="#_error_code_list">1.&nbsp;错误码列表</a></li></ul></div></div><div id="content"><div id="preamble"><div class="sectionbody"><table class="tableblock frame-all grid-all spread"><colgroup><col style="width: 20%;"><col style="width: 20%;"><col style="width: 20%;"><col style="width: 20%;"><col style="width: 20%;"></colgroup><thead><tr><th class="tableblock halign-left valign-top">Version</th><th class="tableblock halign-left valign-top">Update Time</th><th class="tableblock halign-left valign-top">Status</th><th class="tableblock halign-left valign-top">Author</th><th class="tableblock halign-left valign-top">Description</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">v2021-11-05 16:10:28</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">2021-11-05 16:10:28</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">auto</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">@finegirl</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Created by smart-doc</p></td></tr></tbody></table></div></div><div class="sect1"><h2 id="_error_code_list"><a class="anchor" href="#_error_code_list"></a><a class="link" href="#_error_code_list">1.&nbsp;错误码列表</a></h2><div class="sectionbody"><table class="tableblock frame-all grid-all spread"><colgroup><col style="width: 50%;"><col style="width: 50%;"></colgroup><thead><tr><th class="tableblock halign-left valign-top">Error code</th><th class="tableblock halign-left valign-top">Description</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">200</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">ok</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">400</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Bad Request</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">401</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Unauthorized</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">403</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Forbidden</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">404</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Not Found</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">415</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Unsupported Media Type</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">500</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Internal Server Error</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">502</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Bad Gateway</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">503</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Service Unavailable</p></td></tr></tbody></table></div></div><footer class="page-footer"><span class="copyright">Generated by smart-doc at 2021-11-05 16:10:28</span><span class="footer-modification">Suggestions,contact,support and error reporting on<a href="https://gitee.com/smart-doc-team/smart-doc" target="_blank">&nbsp;Gitee</a>&nbsp;or<ahref="https://github.com/smart-doc-group/smart-doc.git" target="_blank">&nbsp;Github</a></span></footer><div href="javascript:void(0)" id="toTop"><img id="upArrow" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABlUlEQVRIS+2UvUvDQBiH398Rly4udnARwUXs4qAIOigI4iL30dTZ2T9AcNPVvUsXF7uYttdScNDFRRAnB11cFFwKxcXBJTQnJ6lEbRI/CIiY9e6e5/e+9+ZAGX/ImE9/QKCU2jfGbGTQqq4xZgtSyisiKmQgIAAVCCFWAGxnIOhqrdd/xyUrpRZsP40xSwA6AI57vd5eq9W6T6s8tQIppSKi+gDQNREprfVNkiRRwDlfY4xZ+FAIuSOi8Qjw0nEc5XnebZwkViClXA2T5+xhY8xus9ncEUJMAziITN5FEARuXLsGCoQQywBs8uEovJ+Scz7FGDuMSM4cx3E9z+u8r+SDQEq5SEQ1IhoZBE+QnBKRq7V+iEreCDjn84wxCx9NgidITnK5nFutVh/7e14FSqnZIAhqAMY+A4+TADjyfb/Ubref7J4XQXhxNvnEV+AJlbTy+XypUqn4KBaLBZuciCa/A0+opN5oNFz7FpUBbP4EHicxxsyAcz7HGDvvz3nar5+2Ho5wOQwsU5+KNGDa+r8grUP0DBLjtRtNKEliAAAAAElFTkSuQmCC"><span id="upText">Top</span></div></div>
<script src="search.js?v=1636099828588"></script>
<script>$(function(){const Accordion=function(el,multiple){this.el=el||{};this.multiple=multiple||false;const links=this.el.find(".dd");links.on("click",{el:this.el,multiple:this.multiple},this.dropdown)};Accordion.prototype.dropdown=function(e){const $el=e.data.el;const $this=$(this),$next=$this.next();$next.slideToggle();$this.parent().toggleClass("open");if(!e.data.multiple){$el.find(".submenu").not($next).slideUp("20").parent().removeClass("open")}};new Accordion($("#accordion"),false);hljs.initHighlightingOnLoad();$(window).scroll(function(){if($(window).scrollTop()>100){$("#toTop").fadeIn(1500);$("#toTop").hover(function(){$("#upArrow").hide();$("#upText").show()},function(){$("#upArrow").show();$("#upText").hide()})}else{$("#toTop").fadeOut(1500)}});$("#toTop").click(function(){$("body, html").animate({scrollTop:0},1000);return false})});
</script>
</body>
</html>
\ No newline at end of file
let api = [];
api.push({
alias: 'error',
order: '1',
link: 'error_code_list',
desc: '错误码列表',
list: []
})
api.push({
alias: 'dict',
order: '2',
link: 'dict_list',
desc: '数据字典',
list: []
})
document.onkeydown = keyDownSearch;
function keyDownSearch(e) {
const theEvent = e;
const code = theEvent.keyCode || theEvent.which || theEvent.charCode;
if (code == 13) {
const search = document.getElementById('search');
const searchValue = search.value;
let searchArr = [];
for (let i = 0; i < api.length; i++) {
let apiData = api[i];
const desc = apiData.desc;
if (desc.indexOf(searchValue) > -1) {
searchArr.push({
order: apiData.order,
desc: apiData.desc,
link: apiData.link,
list: apiData.list
});
} else {
let methodList = apiData.list || [];
let methodListTemp = [];
for (let j = 0; j < methodList.length; j++) {
const methodData = methodList[j];
const methodDesc = methodData.desc;
if (methodDesc.indexOf(searchValue) > -1) {
methodListTemp.push(methodData);
break;
}
}
if (methodListTemp.length > 0) {
const data = {
order: apiData.order,
desc: apiData.desc,
link: apiData.link,
list: methodListTemp
};
searchArr.push(data);
}
}
}
let html;
if (searchValue == '') {
const liClass = "";
const display = "display: none";
html = buildAccordion(api,liClass,display);
document.getElementById('accordion').innerHTML = html;
} else {
const liClass = "open";
const display = "display: block";
html = buildAccordion(searchArr,liClass,display);
document.getElementById('accordion').innerHTML = html;
}
const Accordion = function (el, multiple) {
this.el = el || {};
this.multiple = multiple || false;
const links = this.el.find('.dd');
links.on('click', {el: this.el, multiple: this.multiple}, this.dropdown);
};
Accordion.prototype.dropdown = function (e) {
const $el = e.data.el;
$this = $(this), $next = $this.next();
$next.slideToggle();
$this.parent().toggleClass('open');
if (!e.data.multiple) {
$el.find('.submenu').not($next).slideUp("20").parent().removeClass('open');
}
};
new Accordion($('#accordion'), false);
}
}
function buildAccordion(apiData, liClass, display) {
let html = "";
let doc;
if (apiData.length > 0) {
for (let j = 0; j < apiData.length; j++) {
html += '<li class="'+liClass+'">';
html += '<a class="dd" href="#_' + apiData[j].link + '">' + apiData[j].order + '.&nbsp;' + apiData[j].desc + '</a>';
html += '<ul class="sectlevel2" style="'+display+'">';
doc = apiData[j].list;
for (let m = 0; m < doc.length; m++) {
html += '<li><a href="#_' + apiData[j].order + '_' + doc[m].order + '_' + doc[m].desc + '">' + apiData[j].order + '.' + doc[m].order + '.&nbsp;' + doc[m].desc + '</a> </li>';
}
html += '</ul>';
html += '</li>';
}
}
return html;
}
\ No newline at end of file
...@@ -14,6 +14,204 @@ BigDecimal|小数类型|545.256 ...@@ -14,6 +14,204 @@ BigDecimal|小数类型|545.256
object|对象类型|{"name":"zhang3"} object|对象类型|{"name":"zhang3"}
arrays|数组类型|[{"name":"zhang3"},{"name":"zhang2"}] arrays|数组类型|[{"name":"zhang3"},{"name":"zhang2"}]
## 系统服务
### 登录
**请求URL:** login/login
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 用户登录
**请求参数:**
参数名称|类型|备注|必填|其它
---|---|---|---|---
loginName|String|用户名称|是|-
password|String|用户密码|是|-
securityCode|String|校验码|是|-
**请求样例:**
```
{
"loginName":"zhang3",
"password":"123456",
"securityCode":"5455"
}
```
**响应参数:**
参数名称 |参数类型|备注|其它
---|---|---|---
code|Integer|结果码(-1.失败,1.成功)|-
msg|String|消息|-
**响应消息样例:**
```
{
"msg":"登录成功",
"code":1,
"data":{
}
}
```
### 登出
**请求URL:** login/logout
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 用户退出注销
**请求参数:**
参数名称|类型|备注|必填|其它
---|---|---|---|---
**请求样例:**
```
```
**响应参数:**
参数名称 |参数类型|备注|其它
---|---|---|---
code|Integer|结果码(-1.失败,1.成功)|-
msg|String|消息|-
**响应消息样例:**
```
```
### 修改密码
**请求URL:** user/change/password
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 用户修改密码
**请求参数:**
参数名称|类型|备注|必填|其它
---|---|---|---|---
loginName|String|用户名称|是|-
oldPwd|String|用户加密后密码|是|-
newPwd|String|用户加密后新密码|是|-
**请求样例:**
```
{
"loginName":"zhang3",
"oldPwd":"123456",
"newPwd":"5455"
}
```
**响应参数:**
参数名称 |参数类型|备注|其它
---|---|---|---
code|Integer|结果码(-1.失败,1.成功)|-
msg|String|消息|-
**响应消息样例:**
```
{
"msg":"修改密码成功",
"code":1,
"data":{}
}
```
### 获取验证码
**请求URL:** securitycode/createCode
**请求方式:** GET
**内容类型:** image/gif
**简要描述:** 用户退出注销
**请求参数:**
参数名称|类型|备注|必填|其它
---|---|---|---|---
**请求样例:**
```
```
**响应参数:**
**响应消息样例:**
```
```
### 上传附件
**请求URL:** file/commonupload
**请求方式:** POST
**内容类型:** multipart/form-data
**简要描述:** 用户上传附件
**请求参数:**
参数名称|类型|备注|必填|其它
---|---|---|---|---
file|multipart|附件|是|-
prePath|String|附件存放相对路径|否|不填时候默认为/file/fileupload
**请求样例:**
```
http://127.0.0.1/file/commonupload?prePath=/file/fileupload
Content-Type: multipart/form-data; boundary=WebAppBoundary
--WebAppBoundary
Content-Disposition: form-data; name="file"; filename="1.excel"
Content-Type: multipart/form-data
```
**响应参数:**
**响应消息样例:**
```
```
<#list tableList as table> <#list tableList as table>
## ${table.functionName} ## ${table.functionName}
......
...@@ -49,7 +49,7 @@ public class ${ClassName}Query extends ${ClassName}Entity { ...@@ -49,7 +49,7 @@ public class ${ClassName}Query extends ${ClassName}Entity {
public ${ClassName}Query(){} public ${ClassName}Query(){}
<#list columns as column> <#list columns as column>
<#if column.javaType == "Long"||column.javaType == "Integer"||column.javaType == "BigDecimal"> <#if column.javaType == "Long"||column.javaType == "Integer"||column.javaType == "BigDecimal">
/** /**
* 获取 开始 ${column.columnComment} * 获取 开始 ${column.columnComment}
...@@ -256,7 +256,7 @@ public class ${ClassName}Query extends ${ClassName}Entity { ...@@ -256,7 +256,7 @@ public class ${ClassName}Query extends ${ClassName}Entity {
} }
</#if> </#if>
</#list> </#list>
/** /**
* 获取 OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4) * 获取 OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4)
* @return orConditionList * @return orConditionList
......
package ${packageFeignName};
import com.mortals.xhx.common.pdu.${businessName}.${ClassName}Pdu;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.feign.IFeign;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
/**
* ${functionName} Feign接口
* @author ${author}
* @date ${datetime}
*/
@FeignClient(name = "${code}", path = "${path}", fallback = ${ClassName}FeignFallbackFactory.class)
public interface I${ClassName}Feign extends IFeign {
/**
* 查看${functionName}列表
*
* @param ${className}Pdu
* @return
*/
@PostMapping(value = "/${RequestMapping}/list")
String list(@RequestBody ${ClassName}Pdu ${className}Pdu);
/**
* 查看${functionName}
*
* @param id
* @return
*/
@GetMapping(value = "/${RequestMapping}/info")
String info(@RequestParam(value = "id") Long id);
/**
* 删除${functionName}
*
* @param ids
* @return
*/
@GetMapping(value = "/${RequestMapping}/delete")
String delete(Long[] ids,@RequestHeader("Authorization") String authorization);
/**
* ${functionName}保存更新
*
* @param ${className}Pdu
* @return
*/
@PostMapping(value = "/${RequestMapping}/save")
String save(@RequestBody ${ClassName}Pdu ${className}Pdu,@RequestHeader("Authorization") String authorization);
}
@Slf4j
@Component
class ${ClassName}FeignFallbackFactory implements FallbackFactory<I${ClassName}Feign> {
@Override
public I${ClassName}Feign create(Throwable t) {
return new I${ClassName}Feign() {
@Override
public String list(${ClassName}Pdu ${className}Pdu) {
return JSON.toJSONString(Rest.fail("暂时无法获取${functionName}列表,请稍后再试!"));
}
@Override
public String info(Long id) {
return JSON.toJSONString(Rest.fail("暂时无法获取${functionName}详细,请稍后再试!"));
}
@Override
public String delete(Long[] ids, String authorization) {
return JSON.toJSONString(Rest.fail("暂时无法删除${functionName},请稍后再试!"));
}
@Override
public String save(${ClassName}Pdu ${className}Pdu, String authorization) {
return JSON.toJSONString(Rest.fail("暂时无法保存${functionName},请稍后再试!"));
}
};
}
}
###登录
POST {{baseUrl}}/login/login
Content-Type: application/json
{
"loginName":"admin",
"password":"admin",
"securityCode":"8888"
}
> {%
client.global.set("SmsSet_id", JSON.parse(response.body).data.id);
client.global.set("authToken", JSON.parse(response.body).data.token);
%}
###${functionName}列表 ###${functionName}列表
POST {{baseUrl}}/${RequestMapping}/list POST {{baseUrl}}/${RequestMapping}/list
......
This diff is collapsed.
...@@ -26,8 +26,6 @@ package ${packageName}.model.vo; ...@@ -26,8 +26,6 @@ package ${packageName}.model.vo;
</#if> </#if>
import com.mortals.framework.model.${Entity}; import com.mortals.framework.model.${Entity};
import ${packageName}.model.${ClassName}Entity; import ${packageName}.model.${ClassName}Entity;
import lombok.Data;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
...@@ -36,7 +34,6 @@ import java.util.List; ...@@ -36,7 +34,6 @@ import java.util.List;
* @author ${author} * @author ${author}
* @date ${datetime} * @date ${datetime}
*/ */
@Data
public class ${ClassName}Vo extends ${Entity} { public class ${ClassName}Vo extends ${Entity} {
<#if table.tplCategory=="tree" > <#if table.tplCategory=="tree" >
......
package com.mortals.xhx.utils; package com.mortals.xhx.utils;
import org.springframework.beans.BeansException; import cn.hutool.extra.spring.SpringUtil;
import org.springframework.context.ApplicationContext; import org.springframework.aop.framework.AopContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/**
* @ClassName SpringUtils
* @Description TODO
* @Author finegirl
* @Date 2020/4/24 15:32
**/
@Component @Component
public class SpringUtils implements ApplicationContextAware { public final class SpringUtils extends SpringUtil {
private static ApplicationContext applicationContext; /**
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
*
* @param name
* @return boolean
*/
public static boolean containsBean(String name) {
return getBeanFactory().containsBean(name);
}
@Override /**
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
SpringUtils.applicationContext = applicationContext; * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
*
* @param name
* @return boolean
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().isSingleton(name);
} }
public static ApplicationContext getApplicationContext() { /**
return applicationContext; * @param name
* @return Class 注册对象的类型
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().getType(name);
} }
/** /**
* 对应的被管理类有别名时使用 * 如果给定的bean名字在bean定义中有别名,则返回这些别名
*
* @param name * @param name
* @param <T>
* @return
* @throws BeansException
*/ */
@SuppressWarnings("unchecked") public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
public static <T> T getBean(String name) throws BeansException { return getBeanFactory().getAliases(name);
return (T) applicationContext.getBean(name);
} }
/** /**
* 在对应的注解内未使用别名时 使用 * 获取aop代理对象
*
* @param invoker
* @return
*/ */
public static <T> T getBean(Class<T> clazz) { @SuppressWarnings("unchecked")
return applicationContext.getBean(clazz); public static <T> T getAopProxy(T invoker) {
return (T) AopContext.currentProxy();
} }
} }
...@@ -101,6 +101,15 @@ ...@@ -101,6 +101,15 @@
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.mapstruct</groupId> <groupId>org.mapstruct</groupId>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment