From 63aeb87101772b755b87367b4757d2025c949890 Mon Sep 17 00:00:00 2001 From: zwzw1219 Date: Sat, 30 Sep 2017 20:40:28 +0800 Subject: [PATCH] =?UTF-8?q?!3=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=20Mer?= =?UTF-8?q?ge=20pull=20request=20!3=20from=20zwzw1219/code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/db/boot_backend.sql | 3 + .../com/zw/admin/server/config/JobConfig.java | 25 +- .../server/controller/GenerateController.java | 50 +++ .../com/zw/admin/server/dto/BeanField.java | 25 ++ .../zw/admin/server/dto/GenerateDetail.java | 18 ++ .../zw/admin/server/dto/GenerateInput.java | 64 ++++ .../admin/server/service/GenerateService.java | 32 ++ .../service/impl/GenerateServiceImpl.java | 101 ++++++ .../com/zw/admin/server/utils/FileUtil.java | 85 +++++ .../com/zw/admin/server/utils/StrUtil.java | 55 ++++ .../zw/admin/server/utils/TemplateUtil.java | 302 ++++++++++++++++++ src/main/resources/generate/controller.txt | 77 +++++ src/main/resources/generate/dao.txt | 33 ++ src/main/resources/generate/htmlAdd.txt | 61 ++++ src/main/resources/generate/htmlList.txt | 129 ++++++++ src/main/resources/generate/htmlUpdate.txt | 79 +++++ src/main/resources/generate/java.txt | 13 + src/main/resources/generate/mapper.xml | 33 ++ .../resources/public/pages/generate/edit.html | 194 +++++++++++ src/main/resources/static/js/jq.js | 12 +- 20 files changed, 1377 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/zw/admin/server/controller/GenerateController.java create mode 100644 src/main/java/com/zw/admin/server/dto/BeanField.java create mode 100644 src/main/java/com/zw/admin/server/dto/GenerateDetail.java create mode 100644 src/main/java/com/zw/admin/server/dto/GenerateInput.java create mode 100644 src/main/java/com/zw/admin/server/service/GenerateService.java create mode 100644 src/main/java/com/zw/admin/server/service/impl/GenerateServiceImpl.java create mode 100644 src/main/java/com/zw/admin/server/utils/StrUtil.java create mode 100644 src/main/java/com/zw/admin/server/utils/TemplateUtil.java create mode 100644 src/main/resources/generate/controller.txt create mode 100644 src/main/resources/generate/dao.txt create mode 100644 src/main/resources/generate/htmlAdd.txt create mode 100644 src/main/resources/generate/htmlList.txt create mode 100644 src/main/resources/generate/htmlUpdate.txt create mode 100644 src/main/resources/generate/java.txt create mode 100644 src/main/resources/generate/mapper.xml create mode 100644 src/main/resources/public/pages/generate/edit.html diff --git a/doc/db/boot_backend.sql b/doc/db/boot_backend.sql index 52b5a31..d97966c 100644 --- a/doc/db/boot_backend.sql +++ b/doc/db/boot_backend.sql @@ -323,6 +323,7 @@ INSERT INTO `sys_permission` VALUES ('17', '16', '查询', '', '', '2', 'sys:fil INSERT INTO `sys_permission` VALUES ('18', '16', '删除', '', '', '2', 'sys:file:del', '100'); INSERT INTO `sys_permission` VALUES ('19', '0', '数据源监控', 'fa-eye', 'druid/index.html', '1', '', '9'); INSERT INTO `sys_permission` VALUES ('20', '0', '接口swagger', 'fa-file-pdf-o', 'swagger-ui.html', '1', '', '10'); +INSERT INTO `sys_permission` VALUES ('21', '0', '代码生成', 'fa-wrench', 'pages/generate/edit.html', '1', 'generate:edit', '11'); INSERT INTO `sys_permission` VALUES ('22', '0', '公告管理', 'fa-book', 'pages/article/articleList.html', '1', '', '12'); INSERT INTO `sys_permission` VALUES ('23', '22', '查询', '', '', '2', 'articles:query', '100'); INSERT INTO `sys_permission` VALUES ('24', '22', '添加', '', '', '2', 'articles:add', '100'); @@ -388,6 +389,7 @@ INSERT INTO `sys_role_permission` VALUES ('1', '17'); INSERT INTO `sys_role_permission` VALUES ('1', '18'); INSERT INTO `sys_role_permission` VALUES ('1', '19'); INSERT INTO `sys_role_permission` VALUES ('1', '20'); +INSERT INTO `sys_role_permission` VALUES ('1', '21'); INSERT INTO `sys_role_permission` VALUES ('1', '22'); INSERT INTO `sys_role_permission` VALUES ('1', '23'); INSERT INTO `sys_role_permission` VALUES ('1', '24'); @@ -419,6 +421,7 @@ INSERT INTO `sys_role_permission` VALUES ('2', '17'); INSERT INTO `sys_role_permission` VALUES ('2', '18'); INSERT INTO `sys_role_permission` VALUES ('2', '19'); INSERT INTO `sys_role_permission` VALUES ('2', '20'); +INSERT INTO `sys_role_permission` VALUES ('2', '21'); INSERT INTO `sys_role_permission` VALUES ('2', '22'); INSERT INTO `sys_role_permission` VALUES ('2', '23'); INSERT INTO `sys_role_permission` VALUES ('2', '24'); diff --git a/src/main/java/com/zw/admin/server/config/JobConfig.java b/src/main/java/com/zw/admin/server/config/JobConfig.java index 1525612..6536cb3 100644 --- a/src/main/java/com/zw/admin/server/config/JobConfig.java +++ b/src/main/java/com/zw/admin/server/config/JobConfig.java @@ -10,6 +10,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PropertiesLoaderUtils; +import org.springframework.core.task.TaskExecutor; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import com.zw.admin.server.model.JobModel; @@ -39,22 +40,26 @@ public class JobConfig { @Autowired private JobService jobService; + @Autowired + private TaskExecutor taskExecutor; /** * 初始化一个定时删除日志的任务 */ @PostConstruct public void initDeleteLogsJob() { - JobModel jobModel = new JobModel(); - jobModel.setJobName("delete-logs-job"); - jobModel.setCron("0 0 0 * * ?"); - jobModel.setDescription("定时删除三个月前日志"); - jobModel.setSpringBeanName("sysLogServiceImpl"); - jobModel.setMethodName("deleteLogs"); - jobModel.setIsSysJob(true); - jobModel.setStatus(1); - - jobService.saveJob(jobModel); + taskExecutor.execute(() -> { + JobModel jobModel = new JobModel(); + jobModel.setJobName("delete-logs-job"); + jobModel.setCron("0 0 0 * * ?"); + jobModel.setDescription("定时删除三个月前日志"); + jobModel.setSpringBeanName("sysLogServiceImpl"); + jobModel.setMethodName("deleteLogs"); + jobModel.setIsSysJob(true); + jobModel.setStatus(1); + + jobService.saveJob(jobModel); + }); } } diff --git a/src/main/java/com/zw/admin/server/controller/GenerateController.java b/src/main/java/com/zw/admin/server/controller/GenerateController.java new file mode 100644 index 0000000..1eb2a1e --- /dev/null +++ b/src/main/java/com/zw/admin/server/controller/GenerateController.java @@ -0,0 +1,50 @@ +package com.zw.admin.server.controller; + +import java.util.List; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.zw.admin.server.annotation.LogAnnotation; +import com.zw.admin.server.dto.BeanField; +import com.zw.admin.server.dto.GenerateDetail; +import com.zw.admin.server.dto.GenerateInput; +import com.zw.admin.server.service.GenerateService; + +/** + * 代码生成接口 + * + * @author 小威老师 + * + */ +@RestController +@RequestMapping("/generate") +public class GenerateController { + + @Autowired + private GenerateService generateService; + + @GetMapping(params = { "tableName" }) + @RequiresPermissions("generate:edit") + public GenerateDetail generateByTableName(String tableName) { + GenerateDetail detail = new GenerateDetail(); + detail.setBeanName(generateService.upperFirstChar(tableName)); + List fields = generateService.listBeanField(tableName); + detail.setFields(fields); + + return detail; + } + + @LogAnnotation(module = "生成代码") + @PostMapping + @RequiresPermissions("generate:edit") + public void save(@RequestBody GenerateInput input) { + generateService.saveCode(input); + } + +} diff --git a/src/main/java/com/zw/admin/server/dto/BeanField.java b/src/main/java/com/zw/admin/server/dto/BeanField.java new file mode 100644 index 0000000..fb49f87 --- /dev/null +++ b/src/main/java/com/zw/admin/server/dto/BeanField.java @@ -0,0 +1,25 @@ +package com.zw.admin.server.dto; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class BeanField implements Serializable { + + private static final long serialVersionUID = 4279960350136806659L; + + private String columnName; + + private String columnType; + + private String columnComment; + + private String columnDefault; + + private String name; + + private String type; +} diff --git a/src/main/java/com/zw/admin/server/dto/GenerateDetail.java b/src/main/java/com/zw/admin/server/dto/GenerateDetail.java new file mode 100644 index 0000000..6d6b4b8 --- /dev/null +++ b/src/main/java/com/zw/admin/server/dto/GenerateDetail.java @@ -0,0 +1,18 @@ +package com.zw.admin.server.dto; + +import java.io.Serializable; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class GenerateDetail implements Serializable { + + private static final long serialVersionUID = -164567294469931676L; + + private String beanName; + + private List fields; +} diff --git a/src/main/java/com/zw/admin/server/dto/GenerateInput.java b/src/main/java/com/zw/admin/server/dto/GenerateInput.java new file mode 100644 index 0000000..f691425 --- /dev/null +++ b/src/main/java/com/zw/admin/server/dto/GenerateInput.java @@ -0,0 +1,64 @@ +package com.zw.admin.server.dto; + +import java.io.Serializable; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class GenerateInput implements Serializable { + + private static final long serialVersionUID = -2870071259702969061L; + + /** + * 保存路径 + */ + private String path; + + private String tableName; + + /** + * bean包名 + */ + private String beanPackageName; + + /** + * java类名 + */ + private String beanName; + /** + * dao包名 + */ + private String daoPackageName; + + /** + * dao类名 + */ + private String daoName; + /** + * controller包名 + */ + private String controllerPkgName; + /** + * controller类名 + */ + private String controllerName; + /** + * 字段名 + */ + private List columnNames; + /** + * 属性名 + */ + private List beanFieldName; + /** + * 成员变量类型 + */ + private List beanFieldType; + /** + * 默认值 + */ + private List beanFieldValue; +} diff --git a/src/main/java/com/zw/admin/server/service/GenerateService.java b/src/main/java/com/zw/admin/server/service/GenerateService.java new file mode 100644 index 0000000..91adab3 --- /dev/null +++ b/src/main/java/com/zw/admin/server/service/GenerateService.java @@ -0,0 +1,32 @@ +package com.zw.admin.server.service; + +import java.util.List; + +import com.zw.admin.server.dto.BeanField; +import com.zw.admin.server.dto.GenerateInput; + +public interface GenerateService { + + /** + * 获取数据库表信息 + * + * @param tableName + * @return + */ + List listBeanField(String tableName); + + /** + * 转成驼峰并大写第一个字母 + * + * @param string + * @return + */ + String upperFirstChar(String string); + + /** + * 生成代码 + * + * @param input + */ + void saveCode(GenerateInput input); +} diff --git a/src/main/java/com/zw/admin/server/service/impl/GenerateServiceImpl.java b/src/main/java/com/zw/admin/server/service/impl/GenerateServiceImpl.java new file mode 100644 index 0000000..bcefb84 --- /dev/null +++ b/src/main/java/com/zw/admin/server/service/impl/GenerateServiceImpl.java @@ -0,0 +1,101 @@ +package com.zw.admin.server.service.impl; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Maps; +import com.zw.admin.server.dto.BeanField; +import com.zw.admin.server.dto.GenerateInput; +import com.zw.admin.server.service.GenerateService; +import com.zw.admin.server.utils.StrUtil; +import com.zw.admin.server.utils.TemplateUtil; + +@Service +public class GenerateServiceImpl implements GenerateService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + private RowMapper beanFieldMapper = new RowMapper() { + + @Override + public BeanField mapRow(ResultSet rs, int paramInt) throws SQLException { + BeanField beanField = new BeanField(); + beanField.setColumnName(rs.getString("column_name")); + beanField.setColumnType(rs.getString("data_type")); + beanField.setColumnComment(rs.getString("column_comment")); + beanField.setColumnDefault(rs.getString("column_default")); + + return beanField; + } + }; + + @Override + public List listBeanField(String tableName) { + List beanFields = jdbcTemplate.query( + "select column_name, data_type, column_comment, column_default FROM information_schema.columns WHERE table_name= ? and table_schema = (select database())", + new String[] { tableName }, beanFieldMapper); + + beanFields.parallelStream().forEach(b -> { + b.setName(StrUtil.str2hump(b.getColumnName())); + String type = map.get(b.getColumnType()); + if (type == null) { + type = String.class.getSimpleName(); + } + b.setType(type); + if ("id".equals(b.getName())) { + b.setType(Long.class.getSimpleName()); + } + + b.setColumnDefault(b.getColumnDefault() == null ? "" : b.getColumnDefault()); + }); + + return beanFields; + } + + /** + * mysql类型与java类型部分对应关系 + */ + private static Map map = Maps.newHashMap(); + static { + map.put("int", Integer.class.getSimpleName()); + map.put("tinyint", Integer.class.getSimpleName()); + map.put("double", Double.class.getSimpleName()); + map.put("float", Float.class.getSimpleName()); + map.put("decimal", BigDecimal.class.getSimpleName()); + map.put("date", Date.class.getSimpleName()); + map.put("timestamp", Date.class.getSimpleName()); + map.put("datetime", Date.class.getSimpleName()); + map.put("varchar", String.class.getSimpleName()); + map.put("text", String.class.getSimpleName()); + map.put("longtext", String.class.getSimpleName()); + + } + + @Override + public String upperFirstChar(String string) { + String name = StrUtil.str2hump(string); + String firstChar = name.substring(0, 1); + name = name.replaceFirst(firstChar, firstChar.toUpperCase()); + + return name; + } + + @Override + public void saveCode(GenerateInput input) { + TemplateUtil.saveJava(input); + TemplateUtil.saveJavaDao(input); + TemplateUtil.saveController(input); + TemplateUtil.saveHtmlList(input); + } + +} diff --git a/src/main/java/com/zw/admin/server/utils/FileUtil.java b/src/main/java/com/zw/admin/server/utils/FileUtil.java index b764894..385f69c 100644 --- a/src/main/java/com/zw/admin/server/utils/FileUtil.java +++ b/src/main/java/com/zw/admin/server/utils/FileUtil.java @@ -1,8 +1,13 @@ package com.zw.admin.server.utils; +import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.time.LocalDate; import org.apache.commons.codec.digest.DigestUtils; @@ -68,4 +73,84 @@ public class FileUtil { return "/" + LocalDate.now().toString().replace("-", "/") + "/"; } + /** + * 将文本写入文件 + * + * @param value + * @param path + */ + public static void saveTextFile(String value, String path) { + FileWriter writer = null; + try { + File file = new File(path); + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + + writer = new FileWriter(file); + writer.write(value); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (writer != null) { + writer.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static String getText(String path) { + File file = new File(path); + if (!file.exists()) { + return null; + } + + try { + return getText(new FileInputStream(file)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + + return null; + } + + public static String getText(InputStream inputStream) { + InputStreamReader isr = null; + BufferedReader bufferedReader = null; + try { + isr = new InputStreamReader(inputStream, "utf-8"); + bufferedReader = new BufferedReader(isr); + StringBuilder builder = new StringBuilder(); + String string; + while ((string = bufferedReader.readLine()) != null) { + string = string + "\n"; + builder.append(string); + } + + return builder.toString(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (isr != null) { + try { + isr.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return null; + } } diff --git a/src/main/java/com/zw/admin/server/utils/StrUtil.java b/src/main/java/com/zw/admin/server/utils/StrUtil.java new file mode 100644 index 0000000..b486904 --- /dev/null +++ b/src/main/java/com/zw/admin/server/utils/StrUtil.java @@ -0,0 +1,55 @@ +package com.zw.admin.server.utils; + +import java.util.List; + +import com.google.common.collect.Lists; + +/** + * 字符串转化工具类 + * + * @author 小威老师 + * + */ +public class StrUtil { + + /** + * 字符串转为驼峰 + * + * @param str + * @return + */ + public static String str2hump(String str) { + StringBuffer buffer = new StringBuffer(); + if (str != null && str.length() > 0) { + if (str.contains("_")) { + String[] chars = str.split("_"); + int size = chars.length; + if (size > 0) { + List list = Lists.newArrayList(); + for (String s : chars) { + if (s != null && s.trim().length() > 0) { + list.add(s); + } + } + + size = list.size(); + if (size > 0) { + buffer.append(list.get(0)); + for (int i = 1; i < size; i++) { + String s = list.get(i); + buffer.append(s.substring(0, 1).toUpperCase()); + if (s.length() > 1) { + buffer.append(s.substring(1)); + } + } + } + } + } else { + buffer.append(str); + } + } + + return buffer.toString(); + } + +} diff --git a/src/main/java/com/zw/admin/server/utils/TemplateUtil.java b/src/main/java/com/zw/admin/server/utils/TemplateUtil.java new file mode 100644 index 0000000..6433993 --- /dev/null +++ b/src/main/java/com/zw/admin/server/utils/TemplateUtil.java @@ -0,0 +1,302 @@ +package com.zw.admin.server.utils; + +import java.io.File; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + +import com.zw.admin.server.dto.GenerateInput; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j(topic = "adminLogger") +public class TemplateUtil { + + public static String getTemplete(String fileName) { + return FileUtil.getText(TemplateUtil.class.getClassLoader().getResourceAsStream("generate/" + fileName)); + } + + public static void saveJava(GenerateInput input) { + String path = input.getPath(); + String beanPackageName = input.getBeanPackageName(); + String beanName = input.getBeanName(); + List beanFieldName = input.getBeanFieldName(); + List beanFieldType = input.getBeanFieldType(); + List beanFieldValue = input.getBeanFieldValue(); + + String text = getTemplete("java.txt"); + text = text.replace("{beanPackageName}", beanPackageName).replace("{beanName}", beanName); + + String imports = ""; + if (beanFieldType.contains(BigDecimal.class.getSimpleName())) { + imports += "import " + BigDecimal.class.getName() + ";\n"; + } + if (beanFieldType.contains(Date.class.getSimpleName())) { + imports += "import " + Date.class.getName() + ";"; + } + + text = text.replace("{import}", imports); + String filelds = getFields(beanFieldName, beanFieldType, beanFieldValue); + text = text.replace("{filelds}", filelds); + + FileUtil.saveTextFile(text, path + File.separator + getPackagePath(beanPackageName) + beanName + ".java"); + log.debug("生成java model:{}模板", beanName); + } + + private static String getFields(List beanFieldName, List beanFieldType, + List beanFieldValue) { + StringBuffer buffer = new StringBuffer(); + int size = beanFieldName.size(); + for (int i = 0; i < size; i++) { + String name = beanFieldName.get(i); + if ("id".equals(name) || "createTime".equals(name) || "updateTime".equals(name)) { + continue; + } + String type = beanFieldType.get(i); + buffer.append("\tprivate ").append(type).append(" ").append(name); + // 默认值 +// String value = beanFieldValue.get(i); +// if (!StringUtils.isEmpty(value)) { +// buffer.append(" = "); +// if (type.equals(String.class.getSimpleName())) { +// value = "\"" + value + "\""; +// } else if (type.equals(Double.class.getSimpleName())) { +// value = value + "D"; +// } else if (type.equals(Float.class.getSimpleName())) { +// value = value + "F"; +// } else if (type.equals(BigDecimal.class.getSimpleName())) { +// value = "new BigDecimal(" + value + ")"; +// } +// +// buffer.append(value); +// } + buffer.append(";\n"); + } + + return buffer.toString(); + } + + public static void saveJavaDao(GenerateInput input) { + String path = input.getPath(); + String tableName = input.getTableName(); + String beanPackageName = input.getBeanPackageName(); + String beanName = input.getBeanName(); + String daoPackageName = input.getDaoPackageName(); + String daoName = input.getDaoName(); + + String text = getTemplete("dao.txt"); + text = text.replace("{daoPackageName}", daoPackageName); + text = text.replace("{beanPackageName}", beanPackageName); + text = text.replace("{daoName}", daoName); + text = text.replace("{table_name}", tableName); + text = text.replace("{beanName}", beanName); + text = text.replace("{beanParamName}", lowerFirstChar(beanName)); + + String insertColumns = getInsertColumns(input.getColumnNames()); + text = text.replace("{insert_columns}", insertColumns); + String insertValues = getInsertValues(input.getColumnNames(), input.getBeanFieldName()); + text = text.replace("{insert_values}", insertValues); + FileUtil.saveTextFile(text, path + File.separator + getPackagePath(daoPackageName) + daoName + ".java"); + log.debug("生成java dao:{}模板", beanName); + + text = getTemplete("mapper.xml"); + text = text.replace("{daoPackageName}", daoPackageName); + text = text.replace("{daoName}", daoName); + text = text.replace("{table_name}", tableName); + text = text.replace("{beanName}", beanName); + String sets = getUpdateSets(input.getColumnNames(), input.getBeanFieldName()); + text = text.replace("{update_sets}", sets); + String where = getWhere(input.getColumnNames(), input.getBeanFieldName()); + text = text.replace("{where}", where); + FileUtil.saveTextFile(text, path + File.separator + beanName + "Mapper.xml"); + } + + private static String getInsertValues(List columnNames, List beanFieldName) { + StringBuffer buffer = new StringBuffer(); + int size = columnNames.size(); + for (int i = 0; i < size; i++) { + String column = columnNames.get(i); + if (!"id".equals(column)) { + buffer.append("#{").append(beanFieldName.get(i)).append("}, "); + } + } + + String sets = StringUtils.substringBeforeLast(buffer.toString(), ","); + return sets; + } + + private static String getInsertColumns(List columnNames) { + StringBuffer buffer = new StringBuffer(); + int size = columnNames.size(); + for (int i = 0; i < size; i++) { + String column = columnNames.get(i); + if (!"id".equals(column)) { + buffer.append(column).append(", "); + } + } + + String insertColumns = StringUtils.substringBeforeLast(buffer.toString(), ","); + return insertColumns; + } + + private static String getUpdateSets(List columnNames, List beanFieldName) { + StringBuffer buffer = new StringBuffer(); + int size = columnNames.size(); + for (int i = 0; i < size; i++) { + String column = columnNames.get(i); + if (!"id".equals(column)) { + buffer.append("\t\t\t\n"); + buffer.append("\t\t\t\t" + column).append(" = ").append("#{").append(beanFieldName.get(i)) + .append("}, \n"); + buffer.append("\t\t\t\n"); + } + } + + return buffer.toString(); + } + + private static String getWhere(List columnNames, List beanFieldName) { + StringBuffer buffer = new StringBuffer(); + int size = columnNames.size(); + for (int i = 0; i < size; i++) { + String column = columnNames.get(i); + buffer.append("\t\t\t\n"); + buffer.append("\t\t\t\tand " + column).append(" = ").append("#{params.").append(beanFieldName.get(i)) + .append("} \n"); + buffer.append("\t\t\t\n"); + } + + return buffer.toString(); + } + + /** + * 变量名 + * + * @param beanName + * @return + */ + public static String lowerFirstChar(String beanName) { + String name = StrUtil.str2hump(beanName); + String firstChar = name.substring(0, 1); + name = name.replaceFirst(firstChar, firstChar.toLowerCase()); + + return name; + } + + private static String getPackagePath(String packageName) { + String packagePath = packageName.replace(".", "/"); + if (!packagePath.endsWith("/")) { + packagePath = packagePath + "/"; + } + + return packagePath; + } + + public static void saveController(GenerateInput input) { + String path = input.getPath(); + String beanPackageName = input.getBeanPackageName(); + String beanName = input.getBeanName(); + String daoPackageName = input.getDaoPackageName(); + String daoName = input.getDaoName(); + + String text = getTemplete("controller.txt"); + text = text.replace("{daoPackageName}", daoPackageName); + text = text.replace("{beanPackageName}", beanPackageName); + text = text.replace("{daoName}", daoName); + text = text.replace("{daoParamName}", lowerFirstChar(daoName)); + text = text.replace("{beanName}", beanName); + text = text.replace("{beanParamName}", lowerFirstChar(beanName)); + text = text.replace("{controllerPkgName}", input.getControllerPkgName()); + text = text.replace("{controllerName}", input.getControllerName()); + + FileUtil.saveTextFile(text, path + File.separator + getPackagePath(input.getControllerPkgName()) + + input.getControllerName() + ".java"); + log.debug("生成controller:{}模板", beanName); + } + + public static void saveHtmlList(GenerateInput input) { + String path = input.getPath(); + String beanName = input.getBeanName(); + String beanParamName = lowerFirstChar(beanName); + + String text = getTemplete("htmlList.txt"); + text = text.replace("{beanParamName}", beanParamName); + text = text.replace("{beanName}", beanName); + List beanFieldNames = input.getBeanFieldName(); + text = text.replace("{columnsDatas}", getHtmlColumnsDatas(beanFieldNames)); + text = text.replace("{columnDefs}", getHtmlColumnDefs(beanFieldNames)); + text = text.replace("{ths}", getHtmlThs(beanFieldNames)); + text = text.replace("{lastIndex}", beanFieldNames.size() + ""); + + FileUtil.saveTextFile(text, path + File.separator + beanParamName + "List.html"); + log.debug("生成查询页面:{}模板", beanName); + + text = getTemplete("htmlAdd.txt"); + text = text.replace("{beanParamName}", beanParamName); + text = text.replace("{addDivs}", getAddDivs(beanFieldNames)); + FileUtil.saveTextFile(text, path + File.separator + "add" + beanName + ".html"); + log.debug("生成添加页面:{}模板", beanName); + + text = getTemplete("htmlUpdate.txt"); + text = text.replace("{beanParamName}", beanParamName); + text = text.replace("{addDivs}", getAddDivs(beanFieldNames)); + text = text.replace("{initData}", getInitData(beanFieldNames)); + FileUtil.saveTextFile(text, path + File.separator + "update" + beanName + ".html"); + log.debug("生成修改页面:{}模板", beanName); + } + + private static CharSequence getInitData(List beanFieldNames) { + StringBuilder builder = new StringBuilder(); + beanFieldNames.forEach(b -> { + builder.append("\t\t\t\t\t\t$('#" + b + "').val(data." + b + ");\n"); + }); + + return builder.toString(); + } + + private static String getAddDivs(List beanFieldNames) { + StringBuilder builder = new StringBuilder(); + beanFieldNames.forEach(b -> { + if (!"id".equals(b)) { + builder.append("\t\t\t
\n"); + builder.append("\t\t\t\t\n"); + builder.append("\t\t\t\t
\n"); + builder.append("\t\t\t\t\t\n"); + builder.append("\t\t\t\t
\n"); + builder.append("\t\t\t
\n"); + } + }); + return builder.toString(); + } + + private static String getHtmlThs(List beanFieldNames) { + StringBuilder builder = new StringBuilder(); + beanFieldNames.forEach(b -> { + builder.append("\t\t\t\t\t\t\t\t\t{beanFieldName}\n".replace("{beanFieldName}", b)); + }); + return builder.toString(); + } + + private static String getHtmlColumnsDatas(List beanFieldNames) { + StringBuilder builder = new StringBuilder(); + beanFieldNames.forEach(b -> { + builder.append("\t\t\t\t{\"data\" : \"{beanFieldName}\", \"defaultContent\" : \"\"},\n" + .replace("{beanFieldName}", b)); + }); + + builder.append(""); + return builder.toString(); + } + + private static String getHtmlColumnDefs(List beanFieldNames) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < beanFieldNames.size(); i++) { + builder.append("\t\t\t\t{\"name\" : \"" + beanFieldNames.get(i) + "\", \"targets\" : \"" + i + "\"},\n"); + } + + return builder.toString(); + } +} diff --git a/src/main/resources/generate/controller.txt b/src/main/resources/generate/controller.txt new file mode 100644 index 0000000..c87ce54 --- /dev/null +++ b/src/main/resources/generate/controller.txt @@ -0,0 +1,77 @@ +package {controllerPkgName}; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.zw.admin.server.page.table.PageTableRequest; +import com.zw.admin.server.page.table.PageTableHandler; +import com.zw.admin.server.page.table.PageTableResponse; +import com.zw.admin.server.page.table.PageTableHandler.CountHandler; +import com.zw.admin.server.page.table.PageTableHandler.ListHandler; +import {daoPackageName}.{daoName}; +import {beanPackageName}.{beanName}; + +import io.swagger.annotations.ApiOperation; + +@RestController +@RequestMapping("/{beanParamName}s") +public class {controllerName} { + + @Autowired + private {daoName} {daoParamName}; + + @PostMapping + @ApiOperation(value = "保存") + public {beanName} save(@RequestBody {beanName} {beanParamName}) { + {daoParamName}.save({beanParamName}); + + return {beanParamName}; + } + + @GetMapping("/{id}") + @ApiOperation(value = "根据id获取") + public {beanName} get(@PathVariable Long id) { + return {daoParamName}.getById(id); + } + + @PutMapping + @ApiOperation(value = "修改") + public {beanName} update(@RequestBody {beanName} {beanParamName}) { + {daoParamName}.update({beanParamName}); + + return {beanParamName}; + } + + @GetMapping + @ApiOperation(value = "列表") + public PageTableResponse<{beanName}> list(PageTableRequest request) { + return PageTableHandler.<{beanName}> builder().countHandler(new CountHandler() { + + @Override + public int count(PageTableRequest request) { + return {daoParamName}.count(request.getParams()); + } + }).listHandler(new ListHandler<{beanName}>() { + + @Override + public List<{beanName}> list(PageTableRequest request) { + return {daoParamName}.list(request.getParams(), request.getOffset(), request.getLimit()); + } + }).build().handle(request); + } + + @DeleteMapping("/{id}") + @ApiOperation(value = "删除") + public void delete(@PathVariable Long id) { + {daoParamName}.delete(id); + } +} diff --git a/src/main/resources/generate/dao.txt b/src/main/resources/generate/dao.txt new file mode 100644 index 0000000..c2b1cc4 --- /dev/null +++ b/src/main/resources/generate/dao.txt @@ -0,0 +1,33 @@ +package {daoPackageName}; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import {beanPackageName}.{beanName}; + +@Mapper +public interface {daoName} { + + @Select("select * from {table_name} t where t.id = #{id}") + {beanName} getById(Long id); + + @Delete("delete from {table_name} where id = #{id}") + int delete(Long id); + + int update({beanName} {beanParamName}); + + @Options(useGeneratedKeys = true, keyProperty = "id") + @Insert("insert into {table_name}({insert_columns}) values({insert_values})") + int save({beanName} {beanParamName}); + + int count(@Param("params") Map params); + + List<{beanName}> list(@Param("params") Map params, @Param("offset") Integer offset, @Param("limit") Integer limit); +} diff --git a/src/main/resources/generate/htmlAdd.txt b/src/main/resources/generate/htmlAdd.txt new file mode 100644 index 0000000..92f87cc --- /dev/null +++ b/src/main/resources/generate/htmlAdd.txt @@ -0,0 +1,61 @@ + + + + + + +
+
+
+{addDivs} + +
+
+
+ + +
+
+
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/generate/htmlList.txt b/src/main/resources/generate/htmlList.txt new file mode 100644 index 0000000..4a4488b --- /dev/null +++ b/src/main/resources/generate/htmlList.txt @@ -0,0 +1,129 @@ + + + + +Insert title here + + + + + +
+
+
+
+
+ + + + + +
+
+
+ id: + + +
+
+
+ +
+
+
+ +
+
+ + + + + +{ths} + + + + +
操作
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/generate/htmlUpdate.txt b/src/main/resources/generate/htmlUpdate.txt new file mode 100644 index 0000000..9733f98 --- /dev/null +++ b/src/main/resources/generate/htmlUpdate.txt @@ -0,0 +1,79 @@ + + + + + + +
+
+
+ +{addDivs} + + +
+
+
+ + +
+
+
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/generate/java.txt b/src/main/resources/generate/java.txt new file mode 100644 index 0000000..743ae93 --- /dev/null +++ b/src/main/resources/generate/java.txt @@ -0,0 +1,13 @@ +package {beanPackageName}; + +{import} + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class {beanName} extends BaseEntity { + +{filelds} +} \ No newline at end of file diff --git a/src/main/resources/generate/mapper.xml b/src/main/resources/generate/mapper.xml new file mode 100644 index 0000000..a24aa56 --- /dev/null +++ b/src/main/resources/generate/mapper.xml @@ -0,0 +1,33 @@ + + + + + + +{where} + + + + + + + + + update {table_name} t + +{update_sets} + + + where t.id = #{id} + + + \ No newline at end of file diff --git a/src/main/resources/public/pages/generate/edit.html b/src/main/resources/public/pages/generate/edit.html new file mode 100644 index 0000000..6ed4350 --- /dev/null +++ b/src/main/resources/public/pages/generate/edit.html @@ -0,0 +1,194 @@ + + + + + + +
+
+
+
+ +
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
基本配置
路径 + +
bean包名 + + bean类名 + + dao包名 + + dao类名 + +
controller包名 + + controller类名 + +
+
+ + + + + + + + + + + + + + +
字段详情
表字段名表类型字段描述java字段名java字段类型默认值
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/js/jq.js b/src/main/resources/static/js/jq.js index 1354e33..bdeb82b 100644 --- a/src/main/resources/static/js/jq.js +++ b/src/main/resources/static/js/jq.js @@ -19,8 +19,10 @@ $.ajaxSetup({ }); function buttonDel(data, permission, pers){ - if ($.inArray(permission, pers) < 0) { - return ""; + if(permission != ""){ + if ($.inArray(permission, pers) < 0) { + return ""; + } } var btn = $(""); @@ -28,8 +30,10 @@ function buttonDel(data, permission, pers){ } function buttonEdit(href, permission, pers){ - if ($.inArray(permission, pers) < 0) { - return ""; + if(permission != ""){ + if ($.inArray(permission, pers) < 0) { + return ""; + } } var btn = $(""); -- Gitee