Browse Source

中网小程序微信国际(香港)支付gen模块提交

hyq 6 years ago
parent
commit
83696f830d
23 changed files with 1505 additions and 0 deletions
  1. 14 0
      kmall-gen/kmall-gen.iml
  2. 24 0
      kmall-gen/pom.xml
  3. 74 0
      kmall-gen/src/main/java/com/kmall/gen/controller/SysGeneratorController.java
  4. 22 0
      kmall-gen/src/main/java/com/kmall/gen/dao/SysGeneratorDao.java
  5. 25 0
      kmall-gen/src/main/java/com/kmall/gen/dao/SysOracleGeneratorDao.java
  6. 82 0
      kmall-gen/src/main/java/com/kmall/gen/entity/ColumnEntity.java
  7. 60 0
      kmall-gen/src/main/java/com/kmall/gen/entity/ResultMap.java
  8. 74 0
      kmall-gen/src/main/java/com/kmall/gen/entity/TableEntity.java
  9. 27 0
      kmall-gen/src/main/java/com/kmall/gen/service/SysGeneratorService.java
  10. 125 0
      kmall-gen/src/main/java/com/kmall/gen/service/impl/SysGeneratorServiceImpl.java
  11. 233 0
      kmall-gen/src/main/java/com/kmall/gen/utils/GenUtils.java
  12. 33 0
      kmall-gen/src/main/resources/generator.properties
  13. 33 0
      kmall-gen/src/main/resources/mybatis/mapper/SysGeneratorDao.xml
  14. 67 0
      kmall-gen/src/main/resources/mybatis/mapper/SysOracleGeneratorDao.xml
  15. 107 0
      kmall-gen/src/main/resources/template/Controller.java.vm
  16. 14 0
      kmall-gen/src/main/resources/template/Dao.java.vm
  17. 98 0
      kmall-gen/src/main/resources/template/Dao.xml.vm
  18. 42 0
      kmall-gen/src/main/resources/template/Entity.java.vm
  19. 72 0
      kmall-gen/src/main/resources/template/Service.java.vm
  20. 59 0
      kmall-gen/src/main/resources/template/ServiceImpl.java.vm
  21. 60 0
      kmall-gen/src/main/resources/template/list.html.vm
  22. 144 0
      kmall-gen/src/main/resources/template/list.js.vm
  23. 16 0
      kmall-gen/src/main/resources/template/menu.sql.vm

+ 14 - 0
kmall-gen/kmall-gen.iml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 24 - 0
kmall-gen/pom.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kmall-pt-global</artifactId>
+        <groupId>com.kmall</groupId>
+        <version>3.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.kmall</groupId>
+    <artifactId>kmall-gen</artifactId>
+    <description>代码生成器模块</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.kmall</groupId>
+            <artifactId>kmall-common</artifactId>
+            <version>${kmall-version}</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 74 - 0
kmall-gen/src/main/java/com/kmall/gen/controller/SysGeneratorController.java

@@ -0,0 +1,74 @@
+package com.kmall.gen.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.kmall.gen.service.SysGeneratorService;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import com.kmall.common.xss.XssHttpServletRequestWrapper;
+import org.apache.commons.io.IOUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 代码生成器
+ *
+ * @author Scott
+ * @email
+ * @date 2017年1月3日 下午6:35:28
+ */
+@Controller
+@RequestMapping("/sys/generator")
+public class SysGeneratorController {
+    @Autowired
+    private SysGeneratorService sysGeneratorService;
+
+    /**
+     * 列表
+     */
+    @ResponseBody
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:generator:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+        List<Map<String, Object>> list = sysGeneratorService.queryList(query);
+        int total = sysGeneratorService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(list, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 生成代码
+     */
+    @RequestMapping("/code")
+    @RequiresPermissions("sys:generator:code")
+    public void code(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        String[] tableNames = new String[]{};
+        //获取表名,不进行xss过滤
+        HttpServletRequest orgRequest = XssHttpServletRequestWrapper.getOrgRequest(request);
+        String tables = orgRequest.getParameter("tables");
+        tableNames = JSON.parseArray(tables).toArray(tableNames);
+
+        byte[] data = sysGeneratorService.generatorCode(tableNames);
+
+        response.reset();
+        response.setHeader("Content-Disposition", "attachment; filename=\"AutoCode.zip\"");
+        response.addHeader("Content-Length", "" + data.length);
+        response.setContentType("application/octet-stream; charset=UTF-8");
+
+        IOUtils.write(data, response.getOutputStream());
+    }
+}

+ 22 - 0
kmall-gen/src/main/java/com/kmall/gen/dao/SysGeneratorDao.java

@@ -0,0 +1,22 @@
+package com.kmall.gen.dao;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 代码生成器
+ *
+ * @author Scott
+ * @email
+ * @date 2016年12月19日 下午3:32:04
+ */
+public interface SysGeneratorDao {
+
+    List<Map<String, Object>> queryList(Map<String, Object> map);
+
+    int queryTotal(Map<String, Object> map);
+
+    Map<String, String> queryTable(String tableName);
+
+    List<Map<String, String>> queryColumns(String tableName);
+}

+ 25 - 0
kmall-gen/src/main/java/com/kmall/gen/dao/SysOracleGeneratorDao.java

@@ -0,0 +1,25 @@
+package com.kmall.gen.dao;
+
+
+import com.kmall.gen.entity.ResultMap;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * oracle代码生成器
+ *
+ * @author Scott
+ * @email
+ * @date 2017年07月23日 上午13:06:04
+ */
+public interface SysOracleGeneratorDao {
+
+    List<Map<String, Object>> queryList(Map<String, Object> map);
+
+    int queryTotal(Map<String, Object> map);
+
+    Map<String, String> queryTable(String tableName);
+
+    List<ResultMap> queryColumns(String tableName);
+}

+ 82 - 0
kmall-gen/src/main/java/com/kmall/gen/entity/ColumnEntity.java

@@ -0,0 +1,82 @@
+package com.kmall.gen.entity;
+
+/**
+ * 列的属性
+ *
+ * @author Scott
+ * @email
+ * @date 2016年12月20日 上午12:01:45
+ */
+public class ColumnEntity {
+    //列名
+    private String columnName;
+    //列名类型
+    private String dataType;
+    //列名备注
+    private String comments;
+
+    //属性名称(第一个字母大写),如:user_name => UserName
+    private String attrName;
+    //属性名称(第一个字母小写),如:user_name => userName
+    private String attrname;
+    //属性类型
+    private String attrType;
+    //auto_increment
+    private String extra;
+
+    public String getColumnName() {
+        return columnName;
+    }
+
+    public void setColumnName(String columnName) {
+        this.columnName = columnName;
+    }
+
+    public String getDataType() {
+        return dataType;
+    }
+
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
+
+    public String getComments() {
+        return comments;
+    }
+
+    public void setComments(String comments) {
+        this.comments = comments;
+    }
+
+    public String getAttrname() {
+        return attrname;
+    }
+
+    public void setAttrname(String attrname) {
+        this.attrname = attrname;
+    }
+
+    public String getAttrName() {
+        return attrName;
+    }
+
+    public void setAttrName(String attrName) {
+        this.attrName = attrName;
+    }
+
+    public String getAttrType() {
+        return attrType;
+    }
+
+    public void setAttrType(String attrType) {
+        this.attrType = attrType;
+    }
+
+    public String getExtra() {
+        return extra;
+    }
+
+    public void setExtra(String extra) {
+        this.extra = extra;
+    }
+}

+ 60 - 0
kmall-gen/src/main/java/com/kmall/gen/entity/ResultMap.java

@@ -0,0 +1,60 @@
+package com.kmall.gen.entity;
+
+/**
+ * 名称:ResultMap <br>
+ * 描述:查询表信息返回的BaseResultMap<br>
+ *
+ * @author Scott
+ * @email
+ * @date 2017-09-17 20:20
+ */
+public class ResultMap {
+    /**
+     * 数据库字段名
+     */
+    private String columnName;
+    /**
+     * 字段类型
+     */
+    private String dataType;
+    /**
+     * 字段注释
+     */
+    private String columnComment;
+    /**
+     * 主键
+     */
+    private String columnKey;
+
+    public String getColumnName() {
+        return columnName;
+    }
+
+    public void setColumnName(String columnName) {
+        this.columnName = columnName;
+    }
+
+    public String getDataType() {
+        return dataType;
+    }
+
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
+
+    public String getColumnComment() {
+        return columnComment;
+    }
+
+    public void setColumnComment(String columnComment) {
+        this.columnComment = columnComment;
+    }
+
+    public String getColumnKey() {
+        return columnKey;
+    }
+
+    public void setColumnKey(String columnKey) {
+        this.columnKey = columnKey;
+    }
+}

+ 74 - 0
kmall-gen/src/main/java/com/kmall/gen/entity/TableEntity.java

@@ -0,0 +1,74 @@
+package com.kmall.gen.entity;
+
+import java.util.List;
+
+/**
+ * 表数据
+ *
+ * @author Scott
+ * @email
+ * @date 2016年12月20日 上午12:02:55
+ */
+public class TableEntity {
+    //表的名称
+    private String tableName;
+    //表的备注
+    private String comments;
+    //表的主键
+    private ColumnEntity pk;
+    //表的列名(不包含主键)
+    private List<ColumnEntity> columns;
+
+    //类名(第一个字母大写),如:sys_user => SysUser
+    private String className;
+    //类名(第一个字母小写),如:sys_user => sysUser
+    private String classname;
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getComments() {
+        return comments;
+    }
+
+    public void setComments(String comments) {
+        this.comments = comments;
+    }
+
+    public ColumnEntity getPk() {
+        return pk;
+    }
+
+    public void setPk(ColumnEntity pk) {
+        this.pk = pk;
+    }
+
+    public List<ColumnEntity> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(List<ColumnEntity> columns) {
+        this.columns = columns;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getClassname() {
+        return classname;
+    }
+
+    public void setClassname(String classname) {
+        this.classname = classname;
+    }
+}

+ 27 - 0
kmall-gen/src/main/java/com/kmall/gen/service/SysGeneratorService.java

@@ -0,0 +1,27 @@
+package com.kmall.gen.service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 代码生成器
+ *
+ * @author Scott
+ * @email
+ * @date 2016年12月19日 下午3:33:38
+ */
+public interface SysGeneratorService {
+
+    List<Map<String, Object>> queryList(Map<String, Object> map);
+
+    int queryTotal(Map<String, Object> map);
+
+    Map<String, String> queryTable(String tableName);
+
+    List<Map<String, String>> queryColumns(String tableName);
+
+    /**
+     * 生成代码
+     */
+    byte[] generatorCode(String[] tableNames);
+}

+ 125 - 0
kmall-gen/src/main/java/com/kmall/gen/service/impl/SysGeneratorServiceImpl.java

@@ -0,0 +1,125 @@
+package com.kmall.gen.service.impl;
+
+import com.kmall.gen.dao.SysGeneratorDao;
+import com.kmall.gen.dao.SysOracleGeneratorDao;
+import com.kmall.gen.entity.ResultMap;
+import com.kmall.gen.service.SysGeneratorService;
+import com.kmall.common.utils.Constant;
+import com.kmall.gen.utils.GenUtils;
+import com.kmall.common.utils.StringUtils;
+import org.apache.commons.io.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayOutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipOutputStream;
+
+@Service("sysGeneratorService")
+public class SysGeneratorServiceImpl implements SysGeneratorService {
+    @Autowired
+    private SysGeneratorDao sysGeneratorDao;
+    @Autowired
+    private SysOracleGeneratorDao sysOracleGeneratorDao;
+
+    @Override
+    public List<Map<String, Object>> queryList(Map<String, Object> map) {
+        if ("ORACLE".equals(Constant.USE_DATA)) {
+            List<Map<String, Object>> list = sysOracleGeneratorDao.queryList(map);
+
+            //oracle需转为驼峰命名
+            List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();
+            for (Map<String, Object> stringObjectMap : list) {
+                Map<String, Object> objectMap = new HashMap<String, Object>();
+                for (String key : stringObjectMap.keySet()) {
+                    String mapKey = StringUtils.lineToHump(key);
+                    objectMap.put(mapKey, stringObjectMap.get(key));
+                }
+                mapList.add(objectMap);
+            }
+            return mapList;
+        }
+        return sysGeneratorDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        if ("ORACLE".equals(Constant.USE_DATA)) {
+            return sysOracleGeneratorDao.queryTotal(map);
+        }
+        return sysGeneratorDao.queryTotal(map);
+    }
+
+    @Override
+    public Map<String, String> queryTable(String tableName) {
+        if ("ORACLE".equals(Constant.USE_DATA)) {
+            Map<String, String> objectMap = sysOracleGeneratorDao.queryTable(tableName);
+
+            //oracle需转为驼峰命名
+            Map<String, String> map = new HashMap<String, String>();
+            for (String key : objectMap.keySet()) {
+                String mapKey = StringUtils.lineToHump(key);
+                map.put(mapKey, objectMap.get(key));
+            }
+            return map;
+        }
+        return sysGeneratorDao.queryTable(tableName);
+    }
+
+    @Override
+    public List<Map<String, String>> queryColumns(String tableName) {
+        if ("ORACLE".equals(Constant.USE_DATA)) {
+            List<ResultMap> list = sysOracleGeneratorDao.queryColumns(tableName);
+
+            //oracle
+            List<Map<String, String>> mapList = new ArrayList<Map<String, String>>();
+            for (ResultMap stringObjectMap : list) {
+                // 获取实体类的所有属性,返回Field数组
+                Field[] field = stringObjectMap.getClass().getDeclaredFields();
+
+                Map<String, String> objectMap = new HashMap<String, String>();
+                for (int j = 0; j < field.length; j++) {
+                    // 获取属性的名字
+                    String name = field[j].getName();
+                    // 将属性的首字符大写,方便构造get,set方法
+                    String Name = name.substring(0, 1).toUpperCase() + name.substring(1);
+
+                    try {
+                        Method m = stringObjectMap.getClass().getMethod("get" + Name);
+                        // 调用getter方法获取属性值
+                        String value = (String) m.invoke(stringObjectMap);
+                        objectMap.put(name, value);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+                mapList.add(objectMap);
+            }
+            return mapList;
+        }
+        return sysGeneratorDao.queryColumns(tableName);
+    }
+
+    @Override
+    public byte[] generatorCode(String[] tableNames) {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        ZipOutputStream zip = new ZipOutputStream(outputStream);
+
+        for (String tableName : tableNames) {
+            //查询表信息
+            Map<String, String> table = queryTable(tableName);
+            //查询列信息
+            List<Map<String, String>> columns = queryColumns(tableName);
+            //生成代码
+            GenUtils.generatorCode(table, columns, zip);
+        }
+        IOUtils.closeQuietly(zip);
+        return outputStream.toByteArray();
+    }
+
+}

+ 233 - 0
kmall-gen/src/main/java/com/kmall/gen/utils/GenUtils.java

@@ -0,0 +1,233 @@
+package com.kmall.gen.utils;
+
+import com.kmall.common.utils.Constant;
+import com.kmall.common.utils.DateUtils;
+import com.kmall.common.utils.RRException;
+import com.kmall.gen.entity.ColumnEntity;
+import com.kmall.gen.entity.TableEntity;
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.WordUtils;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * 代码生成器   工具类
+ *
+ * @author Scott
+ * @email
+ * @date 2017年1月3日 下午6:35:28
+ */
+public class GenUtils {
+
+    public static List<String> getTemplates() {
+        List<String> templates = new ArrayList<String>();
+        templates.add("template/Entity.java.vm");
+        templates.add("template/Dao.java.vm");
+        templates.add("template/Dao.xml.vm");
+        templates.add("template/Service.java.vm");
+        templates.add("template/ServiceImpl.java.vm");
+        templates.add("template/Controller.java.vm");
+        templates.add("template/list.html.vm");
+        templates.add("template/list.js.vm");
+        templates.add("template/menu.sql.vm");
+        return templates;
+    }
+
+    /**
+     * 生成代码
+     */
+    public static void generatorCode(Map<String, String> table,
+                                     List<Map<String, String>> columns, ZipOutputStream zip) {
+        //配置信息
+        Configuration config = getConfig();
+
+        //表信息
+        TableEntity tableEntity = new TableEntity();
+        tableEntity.setTableName(table.get("tableName"));
+        tableEntity.setComments(table.get("tableComment"));
+        //表名转换成Java类名
+        String className = tableToJava(tableEntity.getTableName(), config.getString("tablePrefix"));
+        tableEntity.setClassName(className);
+        tableEntity.setClassname(StringUtils.uncapitalize(className));
+
+        //列信息
+        List<ColumnEntity> columsList = new ArrayList<>();
+        for (Map<String, String> column : columns) {
+            ColumnEntity columnEntity = new ColumnEntity();
+            columnEntity.setColumnName(column.get("columnName"));
+            columnEntity.setDataType(column.get("dataType"));
+            columnEntity.setComments(column.get("columnComment"));
+            columnEntity.setExtra(column.get("extra"));
+
+            //列名转换成Java属性名
+            String attrName = columnToJava(columnEntity.getColumnName());
+            columnEntity.setAttrName(attrName);
+            columnEntity.setAttrname(StringUtils.uncapitalize(attrName));
+
+            //列的数据类型,转换成Java类型
+            String attrType = config.getString(columnEntity.getDataType(), "String");
+            columnEntity.setAttrType(attrType);
+
+            //是否主键
+            if ("ORACLE".equals(Constant.USE_DATA)) {
+                if ((column.get("columnName").equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null)) {
+                    tableEntity.setPk(columnEntity);
+                }
+            } else {
+                if (("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null)) {
+                    tableEntity.setPk(columnEntity);
+                }
+            }
+
+            columsList.add(columnEntity);
+        }
+        tableEntity.setColumns(columsList);
+
+        //若没主键
+        if (tableEntity.getPk() == null) {
+            //设置columnName为id的为主键
+            boolean flag = true;
+            for (ColumnEntity columnEntity : tableEntity.getColumns()) {
+                if ("id".equals(columnEntity.getAttrname())) {
+                    tableEntity.setPk(columnEntity);
+                    flag = false;
+                    break;
+                }
+            }
+            //若无id字段则第一个字段为主键
+            if (flag) {
+                tableEntity.setPk(tableEntity.getColumns().get(0));
+            }
+        }
+
+
+        //设置velocity资源加载器
+        Properties prop = new Properties();
+        prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
+        Velocity.init(prop);
+
+        //封装模板数据
+        Map<String, Object> map = new HashMap<>();
+        map.put("tableName", tableEntity.getTableName());
+        map.put("comments", tableEntity.getComments());
+        map.put("pk", tableEntity.getPk());
+        map.put("className", tableEntity.getClassName());
+        map.put("classname", tableEntity.getClassname());
+        map.put("pathName", tableEntity.getClassname().toLowerCase());
+        map.put("columns", tableEntity.getColumns());
+        map.put("package", config.getString("package"));
+        map.put("author", config.getString("author"));
+        map.put("email", config.getString("email"));
+        map.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN));
+        VelocityContext context = new VelocityContext(map);
+
+        //获取模板列表
+        List<String> templates = getTemplates();
+        for (String template : templates) {
+            //渲染模板
+            StringWriter sw = new StringWriter();
+            Template tpl = Velocity.getTemplate(template, "UTF-8");
+            tpl.merge(context, sw);
+
+            try {
+                //添加到zip
+                zip.putNextEntry(new ZipEntry(getFileName(template, tableEntity.getClassName(), config.getString("package"))));
+                IOUtils.write(sw.toString(), zip, "UTF-8");
+                IOUtils.closeQuietly(sw);
+                zip.closeEntry();
+            } catch (IOException e) {
+                throw new RRException("渲染模板失败,表名:" + tableEntity.getTableName(), e);
+            }
+        }
+    }
+
+
+    /**
+     * 列名转换成Java属性名
+     */
+    public static String columnToJava(String columnName) {
+        return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", "");
+    }
+
+    /**
+     * 表名转换成Java类名
+     */
+    public static String tableToJava(String tableName, String tablePrefix) {
+        if (StringUtils.isNotBlank(tablePrefix)) {
+            tableName = tableName.replace(tablePrefix, "");
+        }
+        return columnToJava(tableName);
+    }
+
+    /**
+     * 获取配置信息
+     */
+    public static Configuration getConfig() {
+        try {
+            return new PropertiesConfiguration("generator.properties");
+        } catch (ConfigurationException e) {
+            throw new RRException("获取配置文件失败,", e);
+        }
+    }
+
+    /**
+     * 获取文件名
+     */
+    public static String getFileName(String template, String className, String packageName) {
+        String packagePath = "main" + File.separator + "java" + File.separator;
+        if (StringUtils.isNotBlank(packageName)) {
+            packagePath += packageName.replace(".", File.separator) + File.separator;
+        }
+
+        if (template.contains("Entity.java.vm")) {
+            return packagePath + "entity" + File.separator + className + "Entity.java";
+        }
+
+        if (template.contains("Dao.java.vm")) {
+            return packagePath + "dao" + File.separator + className + "Dao.java";
+        }
+
+        if (template.contains("Dao.xml.vm")) {
+            return packagePath + "dao" + File.separator + className + "Dao.xml";
+        }
+
+        if (template.contains("Service.java.vm")) {
+            return packagePath + "service" + File.separator + className + "Service.java";
+        }
+
+        if (template.contains("ServiceImpl.java.vm")) {
+            return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java";
+        }
+
+        if (template.contains("Controller.java.vm")) {
+            return packagePath + "controller" + File.separator + className + "Controller.java";
+        }
+
+        if (template.contains("list.html.vm")) {
+            return "main" + File.separator + "webapp" + File.separator + "WEB-INF" + File.separator + "page"
+                    + File.separator + "shop" + File.separator + className.toLowerCase() + ".html";
+        }
+
+        if (template.contains("list.js.vm")) {
+            return "main" + File.separator + "webapp" + File.separator + "js" + File.separator + "shop" + File.separator + className.toLowerCase() + ".js";
+        }
+
+        if (template.contains("menu.sql.vm")) {
+            return className.toLowerCase() + "_menu.sql";
+        }
+
+        return null;
+    }
+}

+ 33 - 0
kmall-gen/src/main/resources/generator.properties

@@ -0,0 +1,33 @@
+#\u4EE3\u7801\u751F\u6210\u5668\uFF0C\u914D\u7F6E\u4FE1\u606F
+
+
+#\u5305\u540D
+package=com.kmall
+#\u4F5C\u8005
+author=emato
+#Email
+email=admin@qhdswl.com
+#\u8868\u524D\u7F00(\u7C7B\u540D\u4E0D\u4F1A\u5305\u542B\u8868\u524D\u7F00)
+tablePrefix=mall_
+
+#\u7C7B\u578B\u8F6C\u6362\uFF0C\u914D\u7F6E\u4FE1\u606F
+tinyint=Integer
+smallint=Integer
+mediumint=Integer
+int=Integer
+integer=Integer
+bigint=Long
+float=Float
+double=Double
+decimal=BigDecimal
+
+char=String
+varchar=String
+tinytext=String
+text=String
+mediumtext=String
+longtext=String
+
+date=Date
+datetime=Date
+timestamp=Date

+ 33 - 0
kmall-gen/src/main/resources/mybatis/mapper/SysGeneratorDao.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.gen.dao.SysGeneratorDao">
+	<select id="queryList" resultType="map">
+		select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables 
+			where table_schema = (select database()) 
+		<if test="tableName != null and tableName.trim() != ''">
+			and table_name like concat('%', #{tableName}, '%') 
+		</if>
+		order by create_time desc
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+	<select id="queryTotal" resultType="int">
+		select count(*) from information_schema.tables where table_schema = (select database())
+		<if test="tableName != null and tableName.trim() != ''">
+			and table_name like concat('%', #{tableName}, '%') 
+		</if> 
+	</select> 
+	
+	<select id="queryTable" resultType="map">
+		select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables 
+			where table_schema = (select database()) and table_name = #{tableName}
+	</select> 
+	
+	<select id="queryColumns" resultType="map">
+		select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns
+ 			where table_name = #{tableName} and table_schema = (select database()) order by ordinal_position
+	</select>
+</mapper>

+ 67 - 0
kmall-gen/src/main/resources/mybatis/mapper/SysOracleGeneratorDao.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.gen.dao.SysOracleGeneratorDao">
+    <resultMap id="BaseResultMap" type="com.kmall.gen.entity.ResultMap">
+        <result column="column_name" property="columnName" jdbcType="VARCHAR"/>
+        <result column="data_type" property="dataType" jdbcType="VARCHAR"/>
+        <result column="column_comment" property="columnComment" jdbcType="VARCHAR"/>
+        <result column="column_key" property="columnKey" jdbcType="VARCHAR"/>
+    </resultMap>
+    <select id="queryList" resultType="map">
+        SELECT TABLE_NAME, COMMENTS table_Comment
+        FROM (SELECT ROWNUM AS RN,
+        USER_TAB_COMMENTS.TABLE_NAME TABLE_NAME,
+        USER_TAB_COMMENTS.COMMENTS COMMENTS,
+        USER_TABLES.TABLESPACE_NAME
+        FROM USER_TAB_COMMENTS
+        LEFT JOIN USER_TABLES
+        ON USER_TABLES.TABLE_NAME = USER_TAB_COMMENTS.TABLE_NAME
+        WHERE 1 = 1
+        <if test="tableName != null and tableName.trim() != ''">
+            AND USER_TABLES.table_Name LIKE concat(concat('%', #{tableName}), '%')
+        </if>
+        )
+        WHERE 1 = 1
+        <if test="offset != null and limit != null">
+            AND rn &gt;= #{offset} AND rn &lt;= #{rnum}
+        </if>
+    </select>
+
+    <select id="queryTotal" resultType="int">
+        SELECT COUNT(*)
+        FROM USER_TAB_COMMENTS
+        LEFT JOIN USER_TABLES
+        ON USER_TABLES.TABLE_NAME = USER_TAB_COMMENTS.TABLE_NAME
+        WHERE 1 = 1
+        <if test="tableName != null and tableName.trim() != ''">
+            and USER_TAB_COMMENTS.table_name like concat(concat('%', #{tableName}), '%')
+        </if>
+    </select>
+
+    <select id="queryTable" resultType="map">
+        SELECT USER_TAB_COMMENTS.TABLE_NAME TABLE_NAME,
+        USER_TAB_COMMENTS.COMMENTS   table_Comment,
+        USER_TABLES.TABLESPACE_NAME
+        FROM USER_TAB_COMMENTS
+        LEFT JOIN USER_TABLES
+        ON USER_TABLES.TABLE_NAME = USER_TAB_COMMENTS.TABLE_NAME
+        WHERE USER_TAB_COMMENTS.table_name = #{tableName}
+    </select>
+
+    <select id="queryColumns" resultMap="BaseResultMap">
+		select column_name column_name,
+       lower(DATA_TYPE ||
+             decode(DATA_TYPE,
+                    'DATE',
+                    '',
+                    '(' || nvl(DATA_PRECISION, data_length) ||
+                    nvl2(nullif(DATA_SCALE, 0), ',' || data_scale, '') || ')')) data_type,
+       (select comments from user_col_comments where table_name = #{tableName} and column_name = user_tab_columns.column_Name) column_comment,
+       (select col.column_name from user_constraints con, user_cons_columns col where con.constraint_name = col.constraint_name and con.constraint_type = 'P' and col.table_name = #{tableName}) column_key
+          from user_tab_columns
+          LEFT JOIN USER_TABLES
+            ON USER_TABLES.TABLE_NAME = user_tab_columns.TABLE_NAME
+         WHERE user_tab_columns.table_name = #{tableName}
+	</select>
+</mapper>

+ 107 - 0
kmall-gen/src/main/resources/template/Controller.java.vm

@@ -0,0 +1,107 @@
+package ${package}.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import ${package}.entity.${className}Entity;
+import ${package}.service.${className}Service;
+import ${package}.utils.PageUtils;
+import ${package}.utils.Query;
+import ${package}.utils.R;
+
+/**
+ * ${comments}Controller
+ *
+ * @author ${author}
+ * @email ${email}
+ * @date ${datetime}
+ */
+@Controller
+@RequestMapping("${pathName}")
+public class ${className}Controller {
+    @Autowired
+    private ${className}Service ${classname}Service;
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("${pathName}:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<${className}Entity> ${classname}List = ${classname}Service.queryList(query);
+        int total = ${classname}Service.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(${classname}List, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{${pk.attrname}}")
+    @RequiresPermissions("${pathName}:info")
+    @ResponseBody
+    public R info(@PathVariable("${pk.attrname}") ${pk.attrType} ${pk.attrname}) {
+        ${className}Entity ${classname} = ${classname}Service.queryObject(${pk.attrname});
+
+        return R.ok().put("${classname}", ${classname});
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @RequiresPermissions("${pathName}:save")
+    @ResponseBody
+    public R save(@RequestBody ${className}Entity ${classname}) {
+        ${classname}Service.save(${classname});
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @RequiresPermissions("${pathName}:update")
+    @ResponseBody
+    public R update(@RequestBody ${className}Entity ${classname}) {
+        ${classname}Service.update(${classname});
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @RequiresPermissions("${pathName}:delete")
+    @ResponseBody
+    public R delete(@RequestBody ${pk.attrType}[]${pk.attrname}s) {
+        ${classname}Service.deleteBatch(${pk.attrname}s);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<${className}Entity> list = ${classname}Service.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+}

+ 14 - 0
kmall-gen/src/main/resources/template/Dao.java.vm

@@ -0,0 +1,14 @@
+package ${package}.dao;
+
+import ${package}.entity.${className}Entity;
+
+/**
+ * ${comments}Dao
+ *
+ * @author ${author}
+ * @email ${email}
+ * @date ${datetime}
+ */
+public interface ${className}Dao extends BaseDao<${className}Entity> {
+
+}

+ 98 - 0
kmall-gen/src/main/resources/template/Dao.xml.vm

@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="${package}.dao.${className}Dao">
+
+    <resultMap type="${package}.entity.${className}Entity" id="${classname}Map">
+#foreach($column in $columns)
+        <result property="${column.attrname}" column="${column.columnName}"/>
+#end
+    </resultMap>
+
+	<select id="queryObject" resultType="${package}.entity.${className}Entity">
+		select
+#foreach($column in $columns)
+			`$column.columnName`#if($velocityCount != $columns.size()),
+#end
+#end
+
+		from ${tableName}
+		where ${pk.columnName} = #{id}
+	</select>
+
+	<select id="queryList" resultType="${package}.entity.${className}Entity">
+		select
+#foreach($column in $columns)
+    		`$column.columnName`#if($velocityCount != $columns.size()),
+#end
+#end
+
+		from ${tableName}
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by ${pk.columnName} desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from ${tableName}
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="${package}.entity.${className}Entity"#if($pk.extra == 'auto_increment') useGeneratedKeys="true" keyProperty="$pk.attrname"#end>
+		insert into ${tableName}(
+#foreach($column in $columns)
+#if($column.columnName != $pk.columnName || $pk.extra != 'auto_increment')
+			`$column.columnName`#if($velocityCount != $columns.size()),
+#end
+#end
+#end
+)
+		values(
+#foreach($column in $columns)
+#if($column.columnName != $pk.columnName || $pk.extra != 'auto_increment')
+			#{$column.attrname}#if($velocityCount != $columns.size()),
+#end
+#end
+#end
+)
+	</insert>
+	 
+	<update id="update" parameterType="${package}.entity.${className}Entity">
+		update ${tableName} 
+		<set>
+#foreach($column in $columns)
+#if($column.columnName != $pk.columnName)
+			<if test="$column.attrname != null">`$column.columnName` = #{$column.attrname}#if($velocityCount != $columns.size()), #end</if>
+#end
+#end
+		</set>
+		where ${pk.columnName} = #{${pk.attrname}}
+	</update>
+	
+	<delete id="delete">
+		delete from ${tableName} where ${pk.columnName} = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from ${tableName} where ${pk.columnName} in 
+		<foreach item="${pk.attrname}" collection="array" open="(" separator="," close=")">
+			#{${pk.attrname}}
+		</foreach>
+	</delete>
+
+</mapper>

+ 42 - 0
kmall-gen/src/main/resources/template/Entity.java.vm

@@ -0,0 +1,42 @@
+package ${package}.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+#if(${hasBigDecimal})
+import java.math.BigDecimal;
+#end
+/**
+ * ${comments}实体
+ * 表名 ${tableName}
+ *
+ * @author ${author}
+ * @email ${email}
+ * @date ${datetime}
+ */
+public class ${className}Entity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+#foreach ($column in $columns)
+    /**
+     * $column.comments
+     */
+    private $column.attrType $column.attrname;
+#end
+
+#foreach ($column in $columns)
+    /**
+     * 设置:${column.comments}
+     */
+    public void set${column.attrName}($column.attrType $column.attrname) {
+        this.$column.attrname = $column.attrname;
+    }
+
+    /**
+     * 获取:${column.comments}
+     */
+    public $column.attrType get${column.attrName}() {
+        return $column.attrname;
+    }
+#end
+}

+ 72 - 0
kmall-gen/src/main/resources/template/Service.java.vm

@@ -0,0 +1,72 @@
+package ${package}.service;
+
+import ${package}.entity.${className}Entity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * ${comments}Service接口
+ *
+ * @author ${author}
+ * @email ${email}
+ * @date ${datetime}
+ */
+public interface ${className}Service {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    ${className}Entity queryObject(${pk.attrType} ${pk.attrname});
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<${className}Entity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param ${classname} 实体
+     * @return 保存条数
+     */
+    int save(${className}Entity ${classname});
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param ${classname} 实体
+     * @return 更新条数
+     */
+    int update(${className}Entity ${classname});
+
+    /**
+     * 根据主键删除
+     *
+     * @param ${pk.attrname}
+     * @return 删除条数
+     */
+    int delete(${pk.attrType} ${pk.attrname});
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ${pk.attrname}s
+     * @return 删除条数
+     */
+    int deleteBatch(${pk.attrType}[]${pk.attrname}s);
+}

+ 59 - 0
kmall-gen/src/main/resources/template/ServiceImpl.java.vm

@@ -0,0 +1,59 @@
+package ${package}.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+import ${package}.dao.${className}Dao;
+import ${package}.entity.${className}Entity;
+import ${package}.service.${className}Service;
+
+/**
+ * ${comments}Service实现类
+ *
+ * @author ${author}
+ * @email ${email}
+ * @date ${datetime}
+ */
+@Service("${classname}Service")
+public class ${className}ServiceImpl implements ${className}Service {
+    @Autowired
+    private ${className}Dao ${classname}Dao;
+
+    @Override
+    public ${className}Entity queryObject(${pk.attrType} ${pk.attrname}) {
+        return ${classname}Dao.queryObject(${pk.attrname});
+    }
+
+    @Override
+    public List<${className}Entity> queryList(Map<String, Object> map) {
+        return ${classname}Dao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return ${classname}Dao.queryTotal(map);
+    }
+
+    @Override
+    public int save(${className}Entity ${classname}) {
+        return ${classname}Dao.save(${classname});
+    }
+
+    @Override
+    public int update(${className}Entity ${classname}) {
+        return ${classname}Dao.update(${classname});
+    }
+
+    @Override
+    public int delete(${pk.attrType} ${pk.attrname}) {
+        return ${classname}Dao.delete(${pk.attrname});
+    }
+
+    @Override
+    public int deleteBatch(${pk.attrType}[]${pk.attrname}s) {
+        return ${classname}Dao.deleteBatch(${pk.attrname}s);
+    }
+}

+ 60 - 0
kmall-gen/src/main/resources/template/list.html.vm

@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>${comments}</title>
+#set($header='#parse("sys/header.html")')
+#set($save='#if($shiro.hasPermission("'+${pathName}+':save"))')
+#set($update='#if($shiro.hasPermission("'+${pathName}+':update"))')
+#set($delete='#if($shiro.hasPermission("'+${pathName}+':delete"))')
+#set($end='#end')
+    $header
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                $save
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                $end
+                $update
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                $end
+                $delete
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                $end
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="${classname}" :rules="ruleValidate" :label-width="80">
+#foreach($column in $columns)
+#if($column.columnName != $pk.columnName)
+            <Form-item label="${column.comments}" prop="${column.attrname}">
+                <i-input v-model="${classname}.${column.attrname}" placeholder="${column.comments}"/>
+            </Form-item>
+#end
+#end
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/${pathName}.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 144 - 0
kmall-gen/src/main/resources/template/list.js.vm

@@ -0,0 +1,144 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../${pathName}/list',
+        datatype: "json",
+        colModel: [
+#foreach($column in $columns)
+#if($column.columnName == $pk.columnName)
+			{label: '${column.attrname}', name: '${column.attrname}', index: '${column.columnName}', key: true, hidden: true},
+#else
+			{label: '${column.comments}', name: '${column.attrname}', index: '${column.columnName}', width: 80}#if($velocityCount != $columns.size()),
+#end#end#end
+],
+		viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+	el: '#rrapp',
+	data: {
+        showList: true,
+        title: null,
+		${classname}: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+		    name: ''
+		}
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.${classname} = {};
+		},
+		update: function (event) {
+            let $pk.attrname = getSelectedRow();
+			if ($pk.attrname == null) {
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(${pk.attrname})
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.${classname}.${pk.attrname} == null ? "../${pathName}/save" : "../${pathName}/update";
+			$.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.${classname}),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let ${pk.attrname}s = getSelectedRows();
+			if (${pk.attrname}s == null){
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../${pathName}/delete",
+				    contentType: "application/json",
+				    data: JSON.stringify(${pk.attrname}s),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+		getInfo: function(${pk.attrname}){
+			$.get("../${pathName}/info/"+${pk.attrname}, function (r) {
+                vm.${classname} = r.${classname};
+            });
+		},
+        reloadSearch: function() {
+            vm.q = {
+                name: ''
+            }
+            vm.reload();
+		},
+		reload: function (event) {
+			vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+		},
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+	}
+});

+ 16 - 0
kmall-gen/src/main/resources/template/menu.sql.vm

@@ -0,0 +1,16 @@
+-- 菜单SQL
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `status`)
+    VALUES ('1', '${comments}', 'shop/${pathName}.html', NULL, '1', 'fa fa-file-code-o', '6', '0');
+
+-- 按钮父菜单ID
+set @parentId = @@identity;
+
+-- 菜单对应按钮SQL
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `status`)
+    SELECT @parentId, '查看', null, '${pathName}:list,${pathName}:info', '2', null, '6', '0';
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `status`)
+    SELECT @parentId, '新增', null, '${pathName}:save', '2', null, '6', '0';
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `status`)
+    SELECT @parentId, '修改', null, '${pathName}:update', '2', null, '6', '0';
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `status`)
+    SELECT @parentId, '删除', null, '${pathName}:delete', '2', null, '6', '0';