diff --git a/pig-admin-service/src/main/java/com/github/pig/admin/controller/DictController.java b/pig-admin-service/src/main/java/com/github/pig/admin/controller/DictController.java
index b6598d16..8fe78217 100644
--- a/pig-admin-service/src/main/java/com/github/pig/admin/controller/DictController.java
+++ b/pig-admin-service/src/main/java/com/github/pig/admin/controller/DictController.java
@@ -2,11 +2,13 @@ package com.github.pig.admin.controller;
 
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
 import com.github.pig.admin.entity.SysDict;
 import com.github.pig.admin.service.SysDictService;
 import com.github.pig.common.constant.CommonConstant;
 import com.github.pig.common.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -28,9 +30,31 @@ public class DictController extends BaseController {
     @Autowired
     private SysDictService sysDictService;
 
+    /**
+     * 通过ID查询字典信息
+     *
+     * @param id ID
+     * @return 字典信息
+     */
     @GetMapping("/{id}")
-    public void dict(@PathVariable Integer id) {
+    public SysDict dict(@PathVariable Integer id) {
+        return sysDictService.selectById(id);
+    }
 
+    /**
+     * 分页查询字典信息
+     *
+     * @param page  分页对象
+     * @param limit 每页限制
+     * @return 分页对象
+     */
+    @RequestMapping("/dictPage")
+    public Page dictPage(Integer page, Integer limit) {
+        SysDict condition = new SysDict();
+        condition.setDelFlag(CommonConstant.STATUS_NORMAL);
+        EntityWrapper wrapper = new EntityWrapper(condition);
+        wrapper.orderBy("createTime", false);
+        return sysDictService.selectPage(new Page<>(page, limit), wrapper);
     }
 
     /**
@@ -40,6 +64,7 @@ public class DictController extends BaseController {
      * @return 同类型字典
      */
     @GetMapping("/type/{type}")
+    @Cacheable(value = "dict_details", key = "#type")
     public List<SysDict> findDictByType(@PathVariable String type) {
         SysDict condition = new SysDict();
         condition.setDelFlag(CommonConstant.STATUS_NORMAL);
diff --git a/pig-admin-service/src/main/java/com/github/pig/admin/util/MybatisPlusGenerator.java b/pig-admin-service/src/main/java/com/github/pig/admin/util/MybatisPlusGenerator.java
index fe7905ac..a248450c 100644
--- a/pig-admin-service/src/main/java/com/github/pig/admin/util/MybatisPlusGenerator.java
+++ b/pig-admin-service/src/main/java/com/github/pig/admin/util/MybatisPlusGenerator.java
@@ -3,7 +3,6 @@ package com.github.pig.admin.util;
 import com.baomidou.mybatisplus.generator.AutoGenerator;
 import com.baomidou.mybatisplus.generator.InjectionConfig;
 import com.baomidou.mybatisplus.generator.config.*;
-import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.baomidou.mybatisplus.generator.config.rules.DbType;
 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
@@ -55,7 +54,7 @@ public class MybatisPlusGenerator {
         // 策略配置
         StrategyConfig strategy = new StrategyConfig();
         // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
-        strategy.setTablePrefix(new String[]{"sys_"});// 此处可以修改为您的表前缀
+        strategy.setSuperControllerClass("com.github.pig.common.web.BaseController");
         // 表名生成策略
         strategy.setNaming(NamingStrategy.underline_to_camel);
         mpg.setStrategy(strategy);
@@ -77,10 +76,16 @@ public class MybatisPlusGenerator {
             viewDir.mkdirs();
         }
         List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
-        focList.add(new FileOutConfig("/template/listvue.vue.vm") {
+        focList.add(new FileOutConfig("/templates/listvue.vue.vm") {
             @Override
             public String outputFile(TableInfo tableInfo) {
-                return getGeneratorViewPath(viewOutputDir, tableInfo, "List.vue");
+                return getGeneratorViewPath(viewOutputDir, tableInfo, ".vue");
+            }
+        });
+        focList.add(new FileOutConfig("/templates/controller.java.vm") {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                return getGeneratorViewPath(viewOutputDir, tableInfo, ".java");
             }
         });
         cfg.setFileOutConfigList(focList);
diff --git a/pig-admin-service/src/main/resources/template/list.vue.vm b/pig-admin-service/src/main/resources/template/list.vue.vm
deleted file mode 100644
index 4980fbd5..00000000
--- a/pig-admin-service/src/main/resources/template/list.vue.vm
+++ /dev/null
@@ -1,179 +0,0 @@
-<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@ include file="/commons/global.jsp" %>
-<script type="text/javascript">
-    var ${table.entityPath}DataGrid;
-    $(function() {
-        ${table.entityPath}DataGrid = $('#${table.entityPath}DataGrid').datagrid({
-        url : '${path}/${table.entityPath}/dataGrid',
-        striped : true,
-        rownumbers : true,
-        pagination : true,
-        singleSelect : true,
-        idField : 'id',
-        sortName : 'id',
-        sortOrder : 'asc',
-        pageSize : 20,
-        pageList : [ 10, 20, 30, 40, 50, 100, 200, 300, 400, 500],
-        frozenColumns : [ [ {
-            width : '60',
-            title : '编号',
-            field : 'id',
-            sortable : true
-        }, {
-            width : '60',
-            title : '状态',
-            field : 'status',
-            sortable : true,
-            formatter : function(value, row, index) {
-                switch (value) {
-                case 0:
-                    return '正常';
-                case 1:
-                    return '停用';
-                }
-            }
-        }, {
-            width : '140',
-            title : '创建时间',
-            field : 'createTime',
-            sortable : true
-        }, {
-            field : 'action',
-            title : '操作',
-            width : 200,
-            formatter : function(value, row, index) {
-                var str = '';
-                <shiro:hasPermission name="/${table.entityPath}/edit">
-                    str += $.formatString('<a href="javascript:void(0)" class="${table.entityPath}-easyui-linkbutton-edit" data-options="plain:true,iconCls:\'fi-pencil icon-blue\'" onclick="${table.entityPath}EditFun(\'{0}\');" >编辑</a>', row.id);
-                </shiro:hasPermission>
-                <shiro:hasPermission name="/${table.entityPath}/delete">
-                    str += '&nbsp;&nbsp;|&nbsp;&nbsp;';
-                    str += $.formatString('<a href="javascript:void(0)" class="${table.entityPath}-easyui-linkbutton-del" data-options="plain:true,iconCls:\'fi-x icon-red\'" onclick="${table.entityPath}DeleteFun(\'{0}\');" >删除</a>', row.id);
-                </shiro:hasPermission>
-                return str;
-            }
-        } ] ],
-        onLoadSuccess:function(data){
-            $('.${table.entityPath}-easyui-linkbutton-edit').linkbutton({text:'编辑'});
-            $('.${table.entityPath}-easyui-linkbutton-del').linkbutton({text:'删除'});
-        },
-        toolbar : '#${table.entityPath}Toolbar'
-    });
-});
-
-/**
- * 添加框
- * @param url
- */
-function ${table.entityPath}AddFun() {
-    parent.$.modalDialog({
-        title : '添加',
-        width : 700,
-        height : 600,
-        href : '${path}/${table.entityPath}/addPage',
-        buttons : [ {
-            text : '确定',
-            handler : function() {
-                parent.$.modalDialog.openner_dataGrid = ${table.entityPath}DataGrid;//因为添加成功之后,需要刷新这个treeGrid,所以先预定义好
-                var f = parent.$.modalDialog.handler.find('#${table.entityPath}AddForm');
-                f.submit();
-            }
-        } ]
-    });
-}
-
-
-/**
- * 编辑
- */
-function ${table.entityPath}EditFun(id) {
-    if (id == undefined) {
-        var rows = ${table.entityPath}DataGrid.datagrid('getSelections');
-        id = rows[0].id;
-    } else {
-        ${table.entityPath}DataGrid.datagrid('unselectAll').datagrid('uncheckAll');
-    }
-    parent.$.modalDialog({
-        title : '编辑',
-        width : 700,
-        height : 600,
-        href :  '${path}/${table.entityPath}/editPage?id=' + id,
-        buttons : [ {
-            text : '确定',
-            handler : function() {
-                parent.$.modalDialog.openner_dataGrid = ${table.entityPath}DataGrid;//因为添加成功之后,需要刷新这个dataGrid,所以先预定义好
-                var f = parent.$.modalDialog.handler.find('#${table.entityPath}EditForm');
-                f.submit();
-            }
-        } ]
-    });
-}
-
-
-/**
- * 删除
- */
- function ${table.entityPath}DeleteFun(id) {
-     if (id == undefined) {//点击右键菜单才会触发这个
-         var rows = ${table.entityPath}DataGrid.datagrid('getSelections');
-         id = rows[0].id;
-     } else {//点击操作里面的删除图标会触发这个
-         ${table.entityPath}DataGrid.datagrid('unselectAll').datagrid('uncheckAll');
-     }
-     parent.$.messager.confirm('询问', '您是否要删除当前角色?', function(b) {
-         if (b) {
-             progressLoad();
-             $.post('${path}/${table.entityPath}/delete', {
-                 id : id
-             }, function(result) {
-                 if (result.success) {
-                     parent.$.messager.alert('提示', result.msg, 'info');
-                     ${table.entityPath}DataGrid.datagrid('reload');
-                 }
-                 progressClose();
-             }, 'JSON');
-         }
-     });
-}
-
-
-/**
- * 清除
- */
-function ${table.entityPath}CleanFun() {
-    $('#${table.entityPath}SearchForm input').val('');
-    ${table.entityPath}DataGrid.datagrid('load', {});
-}
-/**
- * 搜索
- */
-function ${table.entityPath}SearchFun() {
-     ${table.entityPath}DataGrid.datagrid('load', $.serializeObject($('#${table.entityPath}SearchForm')));
-}
-</script>
-
-<div class="easyui-layout" data-options="fit:true,border:false">
-    <div data-options="region:'north',border:false" style="height: 30px; overflow: hidden;background-color: #fff">
-        <form id="${table.entityPath}SearchForm">
-            <table>
-                <tr>
-                    <th>名称:</th>
-                    <td><input name="name" placeholder="搜索条件"/></td>
-                    <td>
-                        <a href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'fi-magnifying-glass',plain:true" onclick="${table.entityPath}SearchFun();">查询</a>
-                        <a href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'fi-x-circle',plain:true" onclick="${table.entityPath}CleanFun();">清空</a>
-                    </td>
-                </tr>
-            </table>
-        </form>
-     </div>
- 
-    <div data-options="region:'center',border:false">
-        <table id="${table.entityPath}DataGrid" data-options="fit:true,border:false"></table>
-    </div>
-</div>
-<div id="${table.entityPath}Toolbar" style="display: none;">
-    <shiro:hasPermission name="/${table.entityPath}/add">
-        <a onclick="${table.entityPath}AddFun();" href="javascript:void(0);" class="easyui-linkbutton" data-options="plain:true,iconCls:'fi-page-add'">添加</a>
-    </shiro:hasPermission>
-</div>
\ No newline at end of file
diff --git a/pig-admin-service/src/main/resources/template/log.vue b/pig-admin-service/src/main/resources/template/log.vue
deleted file mode 100644
index a59f081a..00000000
--- a/pig-admin-service/src/main/resources/template/log.vue
+++ /dev/null
@@ -1,124 +0,0 @@
-<template>
-  <div class="app-container calendar-list-container">
-    <div class="filter-container">
-    </div>
-    <el-table :key='tableKey' :data="list" v-loading="listLoading" element-loading-text="给我一点时间" border fit
-              highlight-current-row style="width: 100%">
-
-      <el-table-column align="center" label="序号">
-        <template scope="scope">
-          <span>{{scope.row.id}}</span>
-        </template>
-      </el-table-column>
-
-      <el-table-column label="URI" show-overflow-tooltip>
-        <template scope="scope">
-          <span>{{ scope.row.requestUri}}</span>
-        </template>
-      </el-table-column>
-
-      <el-table-column align="center" label="IP">
-        <template scope="scope">
-          <span>{{scope.row.remoteAddr}}</span>
-        </template>
-      </el-table-column>
-
-      <el-table-column align="center" label="METHOD">
-        <template scope="scope">
-          <span>{{scope.row.method}}</span>
-        </template>
-      </el-table-column>
-
-      <el-table-column align="center" label="PARAMS" show-overflow-tooltip>
-        <template scope="scope">
-          <span>{{scope.row.params}}</span>
-        </template>
-      </el-table-column>
-
-      <el-table-column align="center" label="EXCEPTION">
-        <template scope="scope">
-          <span>{{scope.row.time}}</span>
-        </template>
-      </el-table-column>
-
-      <el-table-column align="center" label="创建时间">
-        <template scope="scope">
-          <span>{{scope.row.createTime | parseTime('{y}-{m}-{d} {h}:{i}')}}</span>
-        </template>
-      </el-table-column>
-
-      <el-table-column label="操作">
-        <template scope="scope">
-          <el-button size="mini" type="danger"
-                     @click="handleDelete(scope.row)">删除
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <div v-show="!listLoading" class="pagination-container">
-      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
-                     :current-page.sync="listQuery.page"
-                     :page-sizes="[10,20,30, 50]" :page-size="listQuery.limit"
-                     layout="total, sizes, prev, pager, next, jumper" :total="total">
-      </el-pagination>
-    </div>
-  </div>
-</template>
-
-<script>
-  import { fetchList, delObj } from '@/api/log'
-  import waves from '@/directive/waves/index.js' // 水波纹指令
-
-  export default {
-    name: 'table_log',
-    directives: {
-      waves
-    },
-    data() {
-      return {
-        list: null,
-        total: null,
-        listLoading: true,
-        listQuery: {
-          page: 1,
-          limit: 20
-        },
-        tableKey: 0
-      }
-    },
-    created() {
-      this.getList()
-    },
-    methods: {
-      getList() {
-        this.listLoading = true
-        fetchList(this.listQuery).then(response => {
-          this.list = response.data.records
-          this.total = response.data.total
-          this.listLoading = false
-        })
-      },
-      handleSizeChange(val) {
-        this.listQuery.limit = val
-        this.getList()
-      },
-      handleCurrentChange(val) {
-        this.listQuery.page = val
-        this.getList()
-      },
-      handleDelete(row) {
-        delObj(row.id)
-          .then(response => {
-            this.dialogFormVisible = false
-            this.getList()
-            this.$notify({
-              title: '成功',
-              message: '删除成功',
-              type: 'success',
-              duration: 2000
-            })
-          })
-      }
-    }
-  }
-</script>
diff --git a/pig-admin-service/src/main/resources/templates/controller.java.vm b/pig-admin-service/src/main/resources/templates/controller.java.vm
new file mode 100644
index 00000000..968ea800
--- /dev/null
+++ b/pig-admin-service/src/main/resources/templates/controller.java.vm
@@ -0,0 +1,121 @@
+package ${package.Controller};
+
+import javax.validation.Valid;
+
+import java.util.List;
+import java.util.Date;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.wangzhixuan.commons.result.PageInfo;
+import ${package.Entity}.${entity};
+import ${package.Service}.${table.serviceName};
+#if(${superControllerClassPackage})
+import ${superControllerClassPackage};
+#end
+
+/**
+ * <p>
+ * $!{table.comment} 前端控制器
+ * </p>
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+@RestController
+@RequestMapping("/${table.entityPath}")
+public class ${table.controllerName} extends ${superControllerClass} {
+    @Autowired private ${table.serviceName} ${table.entityPath}Service;
+
+    @PostMapping("/dataGrid")
+    public PageInfo dataGrid(${entity} ${table.entityPath}, Integer page, Integer rows, String sort,String order) {
+        PageInfo pageInfo = new PageInfo(page, rows, sort, order);
+        EntityWrapper<${entity}> ew = new EntityWrapper<${entity}>(${table.entityPath});
+        Page<${entity}> pages = getPage(pageInfo);
+        pages = ${table.entityPath}Service.selectPage(pages, ew);
+        pageInfo.setRows(pages.getRecords());
+        pageInfo.setTotal(pages.getTotal());
+        return pageInfo;
+    }
+    
+    /**
+     * 添加页面
+     * @return
+     */
+    @GetMapping("/addPage")
+    public String addPage() {
+        return "admin/${table.entityPath}/${table.entityPath}Add";
+    }
+    
+    /**
+     * 添加
+     * @param 
+     * @return
+     */
+    @PostMapping("/add")
+    @ResponseBody
+    public Object add(@Valid ${entity} ${table.entityPath}) {
+        ${table.entityPath}.setCreateTime(new Date());
+        ${table.entityPath}.setUpdateTime(new Date());
+        ${table.entityPath}.setDeleteFlag(0);
+        boolean b = ${table.entityPath}Service.insert(${table.entityPath});
+        if (b) {
+            return renderSuccess("添加成功!");
+        } else {
+            return renderError("添加失败!");
+        }
+    }
+    
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @DeleteMapping("/{id}")
+    @ResponseBody
+    public Object delete(Long id) {
+        ${entity} ${table.entityPath} = new ${entity}();
+        ${table.entityPath}.setId(id);
+        ${table.entityPath}.setUpdateTime(new Date());
+        ${table.entityPath}.setDeleteFlag(1);
+        boolean b = ${table.entityPath}Service.updateById(${table.entityPath});
+        if (b) {
+            return renderSuccess("删除成功!");
+        } else {
+            return renderError("删除失败!");
+        }
+    }
+    
+    /**
+     * 编辑
+     * @param model
+     * @param id
+     * @return
+     */
+    @GetMapping("/editPage")
+    public String editPage(Model model, Long id) {
+        ${entity} ${table.entityPath} = ${table.entityPath}Service.selectById(id);
+        model.addAttribute("${table.entityPath}", ${table.entityPath});
+        return "admin/${table.entityPath}/${table.entityPath}Edit";
+    }
+    
+    /**
+     * 编辑
+     * @param 
+     * @return
+     */
+    @PostMapping("/edit")
+    @ResponseBody
+    public Object edit(@Valid ${entity} ${table.entityPath}) {
+        ${table.entityPath}.setUpdateTime(new Date());
+        boolean b = ${table.entityPath}Service.updateById(${table.entityPath});
+        if (b) {
+            return renderSuccess("编辑成功!");
+        } else {
+            return renderError("编辑失败!");
+        }
+    }
+}
diff --git a/pig-admin-service/src/main/resources/template/listvue.vue.vm b/pig-admin-service/src/main/resources/templates/listvue.vue.vm
similarity index 100%
rename from pig-admin-service/src/main/resources/template/listvue.vue.vm
rename to pig-admin-service/src/main/resources/templates/listvue.vue.vm
diff --git a/pig-admin-service/src/main/resources/templates/menu.sql.vm b/pig-admin-service/src/main/resources/templates/menu.sql.vm
new file mode 100644
index 00000000..1e1449ca
--- /dev/null
+++ b/pig-admin-service/src/main/resources/templates/menu.sql.vm
@@ -0,0 +1,16 @@
+-- 菜单SQL
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
+VALUES ('1', '${comments}', 'modules/generator/${pathName}.html', NULL, '1', 'fa fa-file-code-o', '6');
+
+-- 按钮父菜单ID
+set @parentId = @@identity;
+
+-- 菜单对应按钮SQL
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
+SELECT @parentId, '查看', null, '${pathName}:list,${pathName}:info', '2', null, '6';
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
+SELECT @parentId, '新增', null, '${pathName}:save', '2', null, '6';
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
+SELECT @parentId, '修改', null, '${pathName}:update', '2', null, '6';
+INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
+SELECT @parentId, '删除', null, '${pathName}:delete', '2', null, '6';