diff --git a/README.md b/README.md
index ce41938..1d755eb 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,8 @@ RAP2是在RAP1基础上重做的新项目,它包含两个组件(对应两个Gi
 * [Official Site 官网: rap2.taobao.org](http://rap2.taobao.org)
 * 钉钉群ID: 11789704
 * [热心网友提供的部署文档,供参考](https://github.com/thx/rap2-delos/issues/119)
+* [用户手册](https://github.com/thx/rap2-delos/wiki/user_manual)
+* [常见问题](https://github.com/thx/rap2-delos/wiki/faq)
 
 ## 部署
 
diff --git a/src/config/config.dev.ts b/src/config/config.dev.ts
index 1ba1924..3bc17b1 100644
--- a/src/config/config.dev.ts
+++ b/src/config/config.dev.ts
@@ -19,9 +19,9 @@ let config: IConfigOptions = {
     pool: {
       max: 5,
       min: 0,
-      idle: 10000
+      idle: 10000,
     },
-    logging: true
+    logging: false,
   },
   redis: {
     // isRedisCluster: true,
diff --git a/src/routes/mock.ts b/src/routes/mock.ts
index 3376a95..6a13267 100644
--- a/src/routes/mock.ts
+++ b/src/routes/mock.ts
@@ -113,7 +113,6 @@ const REG_URL_METHOD = /^\/?(get|post|delete|put)/i
 router.all('/app/mock/:repositoryId(\\d+)/:url(.+)', async (ctx) => {
   let app: any = ctx.app
   app.counter.mock++
-
   let { repositoryId, url } = ctx.params
   let method = ctx.request.method
   repositoryId = +repositoryId
diff --git a/src/routes/utils/tree.ts b/src/routes/utils/tree.ts
index a493ca0..e15cda2 100644
--- a/src/routes/utils/tree.ts
+++ b/src/routes/utils/tree.ts
@@ -1,13 +1,13 @@
 import { Property } from "../../models";
+import * as _ from 'underscore'
 const vm = require('vm')
-const _ = require('underscore')
 import * as Mock from 'mockjs'
 const { RE_KEY } = require('mockjs/src/mock/constant')
 
 
 export default class Tree {
 
-  public static ArrayToTree (list: Property[]) {
+  public static ArrayToTree(list: Property[]) {
     let result: any = {
       name: 'root',
       children: [],
@@ -17,7 +17,7 @@ export default class Tree {
     let mapped: any = {}
     list.forEach(item => { mapped[item.id] = item })
 
-    function _parseChildren (parentId: any, children: any, depth: any) {
+    function _parseChildren(parentId: any, children: any, depth: any) {
       for (let id in mapped) {
         let item = mapped[id]
         if (typeof parentId === 'function' ? parentId(item.parentId) : item.parentId === parentId) {
@@ -43,8 +43,8 @@ export default class Tree {
   }
 
   // TODO 2.x 和前端重复了
-  public static TreeToTemplate (tree: any) {
-    function parse (item: any, result: any) {
+  public static TreeToTemplate(tree: any) {
+    function parse(item: any, result: any) {
       let rule = item.rule ? ('|' + item.rule) : ''
       let value = item.value
       switch (item.type) {
@@ -110,7 +110,7 @@ export default class Tree {
     return result
   }
 
-  public static TemplateToData (template: any) {
+  public static TemplateToData(template: any) {
     // 数据模板 template 中可能含有攻击代码,例如死循环,所以在沙箱中生成最终数据
     // https://nodejs.org/dist/latest-v7.x/docs/api/vm.html
     const sandbox = { Mock, template, data: {} }
@@ -137,9 +137,8 @@ export default class Tree {
 
   public static ArrayToTreeToTemplateToData(list: Property[], extra?: any) {
     let tree = Tree.ArrayToTree(list)
-    let template = Tree.TreeToTemplate(tree)
+    let template: { [key: string]: any } = Tree.TreeToTemplate(tree)
     let data
-
     if (extra) {
       // DONE 2.2 支持引用请求参数
       let keys = Object.keys(template).map(item => item.replace(RE_KEY, '$1'))
@@ -147,6 +146,17 @@ export default class Tree {
       let scopedData = Tree.TemplateToData(
         Object.assign({}, _.pick(extra, extraKeys), template),
       )
+      for (const key in scopedData) {
+        if (!scopedData.hasOwnProperty(key)) continue
+        let data = scopedData[key]
+        for (const eKey in extra) {
+          if (!extra.hasOwnProperty(eKey)) continue
+          const pattern = new RegExp(`\\$${eKey}\\$`, 'g')
+          if (data && pattern.test(data)) {
+            data = scopedData[key] = data.replace(pattern, extra[eKey])
+          }
+        }
+      }
       data = _.pick(scopedData, keys)
     } else {
       data = Tree.TemplateToData(template)
diff --git a/src/service/redis.ts b/src/service/redis.ts
index b7b2379..df32765 100644
--- a/src/service/redis.ts
+++ b/src/service/redis.ts
@@ -1,13 +1,12 @@
 import * as redis from 'redis'
-import * as ioredis from 'ioredis'
 import config from '../config'
+import * as ioredis from 'ioredis'
 
 export enum CACHE_KEY {
   REPOSITORY_GET = 'REPOSITORY_GET',
 }
 
 export default class RedisService {
-  // 判断 是否使用cluster集群
   private static client: redis.RedisClient = config.redis && config.redis.isRedisCluster ? new ioredis.Cluster(config.redis.nodes, {redisOptions: config.redis.redisOptions}) : redis.createClient(config.redis)
 
   private static getCacheKey(key: CACHE_KEY, entityId?: number): string {
diff --git a/src/types/index.d.ts b/src/types/index.d.ts
index 2d9a4e5..89e30c3 100644
--- a/src/types/index.d.ts
+++ b/src/types/index.d.ts
@@ -1,5 +1,4 @@
 /// <reference path="custom-typings.d.ts" />
-
 import { PoolOptions } from "sequelize";
 import { ISequelizeConfig } from "sequelize-typescript";
 import { RedisOptions } from "koa-redis";
@@ -10,6 +9,7 @@ declare interface RedisAndClusterOptions extends RedisOptions {
   redisOptions?: any;
 }
 
+
 declare interface IConfigOptions {
   version: string,
   serve: {
@@ -22,4 +22,4 @@ declare interface IConfigOptions {
   keycenter?: string | boolean,
   db: ISequelizeConfig,
   redis: RedisAndClusterOptions
-}
+}
\ No newline at end of file